请求指定无效Content-Encoding标头的适当HTTP状态代码?

时间:2012-07-12 21:32:52

标签: http http-headers http-status-codes

如果客户端发送HTTP请求并指定服务器无法解码的Content-Encoding标头,应返回什么状态代码?

示例

客户端将JSON数据POST到REST资源,并使用gzip编码对实体主体进行编码。但是,服务器只能解码DEFLATE编码,因为它在服务器学校的gzip类失败了。

应该返回什么HTTP响应代码?我会说 415 Unsupported Media Type 但实际上不是实体的Content-Type问题 - 它是受支持的实体主体的编码。

哪个更合适:415? 400?也许是自定义响应代码?


附录:我当然彻底检查了rfc2616。如果答案在那里,我可能需要一些新的矫正眼镜,但我不相信它。


更新

这与发送可能对客户端不可接受的响应无关。问题是客户端正在向服务器发送服务器无法理解的编码中的有效媒体类型(根据客户端随请求消息打包的Content-Encoding标头)。

这是一个边缘情况,在处理浏览器用户代理时不会遇到,但它可能会在REST API中出现,接受实体主体来创建/修改资源。

2 个答案:

答案 0 :(得分:46)

当我读它时,415 Unsupported Media Type听起来最合适。

来自RFC 2616:

  

10.4.16 415不支持的媒体类型

     

服务器拒绝为请求提供服务,因为请求的实体采用所请求方法所请求资源不支持的格式。

是的,文本部分说“媒体类型”而不是“编码”,但实际描述中没有提到任何区别。

新的热度,RFC 7231,甚至是明确的:

  

6.5.13。 415不支持的媒体类型

     

415(不支持的媒体类型)状态代码表示
  原始服务器因为有效负载而拒绝服务请求   在目标资源上采用此方法不支持的格式   格式问题可能是由于请求的指示而造成的   内容类型或内容编码,或检查中的结果   数据直接。

答案 1 :(得分:11)

他们应该做出关于谁想成为百万富翁的最后一个问题!

浏览器提出服务器无法提供服务的请求,因为客户端提供的信息格式是服务器无法处理的。但是,这不是服务器因为不支持客户端提供的数据而导致的错误,因为客户端没有收听服务器的Acccept- *标头并以不适当的编码方式提供数据。这将使它成为客户端错误(400系列错误代码)。

  • 我的第一直觉是400 Bad Request是这种情况下的恰当回应。
  • 405 Method Not Allowed不正确,因为它引用的HTTP动词是不允许的动词。
  • 406 Not Acceptable看起来可能有承诺,但它指的是服务器无法向满足其发送的Accept- *请求标头的客户端提供数据。这似乎不适合你的情况。
  • 412 Precondition Failed相当模糊。这可能是合适的,但我不会赌它。
  • 415不支持的媒体类型不正确,因为它不是被拒绝的数据类型,而是编码格式。

之后我们进入非标准响应代码领域。

  • 422 Unprocessable Entity描述了一个响应,如果请求格式正确但是在某种程度上它在语义上是错误的,则应该返回该响应。这看起来很合适,但它是HTTP的WebDAV扩展而不是标准。

鉴于上述情况,我个人会选择400 Bad Request。如果任何其他HTTP专家有更好的候选人,我会听取他们的意见。 ;)

更新:我以前一直在维基百科的网页上引用HTTP状态。虽然那里的信息似乎是准确的,但它也不够全面。查看来自W3C的规范提供了有关HTTP 406的更多信息,并且它让我认为406可能是正确的代码。

  

10.4.7 406不可接受

     

请求标识的资源只能生成   具有不可接受的内容特征的响应实体   根据请求中发送的接受标头。

     

除非是HEAD请求,否则响应应该包含一个实体   包含可用实体特征和位置的列表   用户或用户代理可以从中选择最合适的用户。   实体格式由中给出的媒体类型指定   Content-Type标头字段。取决于格式和   用户代理的功能,选择最合适   选择可以自动执行。但是,这个规范   没有为这种自动选择定义任何标准。

  Note: HTTP/1.1 servers are allowed to return responses which are
  not acceptable according to the accept headers sent in the
  request. In some cases, this may even be preferable to sending a
  406 response. User agents are encouraged to inspect the headers of
  an incoming response to determine if it is acceptable.
     

如果响应可能是不可接受的,那么用户代理应该暂时   停止接收更多数据并查询用户以进一步做出决定   动作。

虽然它确实明确地提到了Content-Type标头,但是措辞提到了“实体特征”,你可以把它读作覆盖像GZIP和DEFLATE压缩这样的东西。

值得注意的一点是,该规范表明,按原样发送数据可能是合适的,并且标题可以告诉客户端它使用的格式和使用的编码,并将其保留给客户端整理。因此,如果客户端发送一个标题表明它接受GZIP压缩,但服务器只能生成一个DEFLATE响应,那么发送它与标题说它是DEFLATE应该没问题(取决于上下文)。

  • 客户:给我一个GZIPPED页面。
  • 服务器:对不起,没办法。我可以为你包装它。这是DEFLATE打包页面。这对你好吗?
  • 客户:Welllll ......我真的不想要DEFLATE,但我可以解码它,所以我会接受它。

(或)

  • 客户:我想我必须与我的用户清楚。坚持,稍等。