2013-02-21 127 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所提到的那樣非常低。我只是爲了完整性而包含這個答案。