不向客户端返回任何内容的POST方法是否需要Accept标头?

时间:2019-05-15 13:30:12

标签: rest api http header rfc

我有一个端点,该端点支持内容类型为json(仅)的POST方法。但是POST请求除了其状态码外,不会在其响应主体中返回任何内容。在这种情况下,正确的行为是什么?

  1. 客户端发送POST,接受标头为application/json
  2. 客户端发送POST,接受标头为application/xml

在情况2下服务器应该返回错误吗?

3 个答案:

答案 0 :(得分:3)

服务器 可能会忽略Accept标头。

如果您没有在响应中返回任何内容,那是毫无意义的。由您决定是否要拒绝带有Accept标头的请求。

但是我认为大多数系统不会拒绝这些请求。

答案 1 :(得分:1)

RFC 7231描述了Accept头的语义

  

没有任何Accept标头字段的请求表示用户代理将接受任何媒体类型作为响应。

     

如果请求中存在标头字段,并且响应的任何可用表示形式均没有列出可接受的媒体类型,则原始服务器可以通过发送406(不可接受)响应来遵守标头字段,或者通过将响应视为未经内容协商的方式来忽略标头字段。

客户端提供的Accept标头应该反映客户端所看到的请求的上下文;例如,对于每种情况,Web浏览器可能会为<img><script>使用不同的Accept标头,以鼓励服务器提供有用的表示形式。

In the case of a POST,您要协商的内容是“操作的状态或从操作中获得的结果”的表示形式,而不是资源本身的表示形式。

如果当媒体类型为application/json时响应的表示形式为zero bytes long,那么我期望当媒体类型为application/xml时响应也为零字节。因此,对我来说,接受其中一个而不是另一个并不明显。

答案 2 :(得分:0)

https://datatracker.ietf.org/doc/html/rfc7231#section-5.3.2

<块引用>

没有任何 Accept 头域的请求意味着用户代理 将接受任何媒体类型作为响应。如果头域是
出现在请求中,并且没有
的可用表示 响应具有被列为可接受的媒体类型,
源站服务器可以通过发送 406(不是 可接受)响应或忽略标头字段,通过处理
就好像它不受内容协商的影响一样。

所以无论是 2 我们都可以做