对不可接受的Accept标头的HTTP响应

时间:2013-02-21 23:36:05

标签: api http rest

我的RESTFul API只能响应JSON编码的数据(即我的所有标题都有Content-Type: application/json)。如果请求具有不允许JSON的Accept标头(例如,Accept: text/html),我应该返回什么?我是否应该在正文中返回400 Bad Request并附上解释,或者是否有针对此例外的更具体的状态代码?

请注意,这与unsupported request content-types不同。

2 个答案:

答案 0 :(得分:10)

如果你想要在语义上正确:

如果请求是HTTP / 1.0:

a 406 Not Acceptable是正确的返回,因为客户端可能无法处理不属于所请求类型的响应。

在HTTP / 1.1中,这仍然是“正确”的事情,但也有例外,

来自RFC 2616 Sec 10.4.7

 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.

事实上,正如@Jack所提到的那样,问题的可能性非常低。为了完整起见,我只是将这个答案包括在内。

答案 1 :(得分:4)

不要打扰。

有些情况下,您服务的消费者不会费心设置此标头,例如在PHP中使用cURLfile_get_contents()时。

如果您的API文档声明您的服务仅支持JSON输出,那应该足够了。

您还可以使用扩展程序来强制执行格式,例如/path/to/resource.json?a=b分别用于JSON和XML。

如果您想支持多种输出格式且/path/to/resource.xml?a=b请求标头值不具有决定性,则应定义默认输出格式。