2013-02-21 125 views
5

我的基于REST API只能响应JSON编码的数据(即,所有我的标头具有Content-Type: application/json)。如果请求的Accept标头不允许JSON(例如,Accept: text/html),我应该返回什么?我是否应该返回一个400 Bad Request以及正文中的解释,或者是否存在此异常的更具体的状态码?HTTP响应Accept头

注意,这是从unsupported request content-types不同。

回答

3

不要打扰。

会有这样的情况,从而为您服务的消费者不会刻意去设置这个头,例如在PHP中使用cURLfile_get_contents()时。

如果你的API文档指出您的服务只支持JSON输出,这应该是足够好的。

您也可以使用扩展来强制执行格式,例如分别为JSON和XML的/path/to/resource.json?a=b/path/to/resource.xml?a=b

如果您希望支持多种输出格式,并且Accept请求标头值不确定,则应该定义默认的输出格式。

+1

所以你说只是返回通常的响应与'Content-Type:application/json'无论如何? – 2013-02-21 23:40:46

+1

@AtilaO。肯定:) – 2013-02-21 23:41:04

+0

好吧,这很简单。另一方面,如果API可以同时支持JSON和其他内容,比如说Bencode('application/x-bencode'),但是请求指定了第三个参数,比如说'Accept:text/xml',你会怎么做? (我知道这不是我原来的问题的一部分。) – 2013-02-21 23:44:45

9

如果你想成为语义正确:

如果请求是HTTP/1.0:

406不接受是返回正确的事情,因为客户端可能无法处理的响应这不是所要求的类型。

在HTTP/1.1

,这仍然是 “正确” 的事情,但也有例外,

从2616秒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所提到的那样非常低。我只是为了完整性而包含这个答案。