如果客户端发送HTTP请求并指定服务器无法解码的Content-Encoding标头,应返回什么状态代码?
示例
客户端将JSON数据POST到REST资源,并使用gzip编码对实体主体进行编码。但是,服务器只能解码DEFLATE编码,因为它在服务器学校的gzip类失败了。
应该返回什么HTTP响应代码?我会说 415 Unsupported Media Type 但实际上不是实体的Content-Type问题 - 它是受支持的实体主体的编码。
哪个更合适:415? 400?也许是自定义响应代码?
附录:我当然彻底检查了rfc2616。如果答案在那里,我可能需要一些新的矫正眼镜,但我不相信它。
更新
这与发送可能对客户端不可接受的响应无关。问题是客户端正在向服务器发送服务器无法理解的编码中的有效媒体类型(根据客户端随请求消息打包的Content-Encoding
标头)。
这是一个边缘情况,在处理浏览器用户代理时不会遇到,但它可能会在REST API中出现,接受实体主体来创建/修改资源。
答案 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。如果任何其他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应该没问题(取决于上下文)。
(或)