2009-01-01 88 views
58

我的REST API返回JSON。REST API返回JSON的MIME類型是什麼?

我目前正在返回text/plain作爲MIME類型,但感覺很有趣。 我應該返回application/x-javascript還是其他類型?

第二個問題是關於錯誤條件的HTTP狀態碼。 如果我的REST API返回錯誤狀態,我回來的JSON

{ result: "fail", errorcode: 1024, errormesg: "That sucked. Try again!" } 

如果HTTP狀態代碼保持在200 OK

+0

所有的答案,這似乎認爲瀏覽器參與。我的REST應用程序發送和響應json消息。所有的序列化和反序列化都是在客戶端和服務器內部完成的。第三方瀏覽器與其中的任何一個都沒有任何關係,對於非常具體的非公用計算機來說,這些都是非常具體的機器。在這種情況下,「application/whatever_type」使得零差別,它只是文本。 「application/json」確實強化了數據是json,但只是作爲評論,這已經是任何使用API​​的人都會知道的第一件事了。 – mickeyf 2017-02-08 15:32:03

回答

70

JSON規範建議application/json,這似乎是由IETFIANA註冊表支持。

第二個問題,我認爲如果消息處理失敗了,你應該返回一個結構化的標準錯誤響應作爲JSON消息;只有當由於某種原因將消息傳遞給後端處理程序失敗時,才應考慮HTTP錯誤代碼。

更新2014年6月27日:其中客戶端(瀏覽器)只用200響應工作的日子早已過去和RESTful API中流行的建議是使用適當的HTTP響應代碼的響應,爲2XX對於所有錯誤條件(包括來自API本身的錯誤條件)的成功響應(例如201爲PUT創建; 204爲DELETE無內容)以及4xx和5xx。

+0

感謝您提供JSON規範的鏈接。我發現另一個指向另一個MIME類型「text/x-json」的stackoverflow問題。不知道有什麼區別。 http://stackoverflow.com/questions/95554/overriding-a-mime-type-in​​-rails – ashitaka 2009-01-01 03:38:57

+6

對於實際的原因(例如說你有在混合Flex的可怕的HTTP客戶端),有時你必須使用200爲了一切。但是,在正常情況下,您希望針對該情況使用最合適的HTTP狀態碼。 – 2009-10-31 05:08:24

10

我更願意回覆HTTP錯誤狀態和應用程序特定的有效負載。

10

不,你不應該在錯誤情況下返回200。

可以重複狀態碼或在響應有效載荷中包含更詳細的錯誤代碼。

6

根據RFC 4627,返回的合適的Content-typeapplication/json,它也註冊MIME類型IANA(實際上,它顯示在IANA的頁面上)。當然,如果你要寫一個客戶,你會希望在你接受的內容中更加自由,同時也接受其他人,比如text/jsontext/x-json

現在,如果有錯誤,您應該而不是返回HTTP 200,這基本上是非RESTful。我知道有時候你的錯誤並不完全匹配,但是在RFC 2616 Sections 10.4 -10.5中選擇最接近的4XX(客戶端錯誤)或5XX(服務器錯誤)錯誤,並且在JSON中更精確。

0

如果使用「REST API」表示您希望遵循REST體系結構,則要使用的介質類型取決於您希望通過REST API公開的功能。你想創建新的對象嗎?查詢對象列表?編輯一個對象?如果是這樣,那麼使用一個好的RESTful媒體類型可能是vnd.collection + json,因爲它定義了一個超文本鏈接接口來操縱json對象的集合。

注:一個RESTful API可以使用的媒體類型應用程序/ JSON,但這種媒體類型不具有超文本鏈接的RESTful接口,所以它會在狀態變化的終點。

遵循Web API體系結構也是完全可以接受的,其中HTTP RPC調用返回應用程序/ json對象,其他HTTP RPC調用操作這些對象,並且沒有用於使用和瀏覽狀態更改的超文本鏈接接口。但這不是REST。

我喜歡REST的描述(來自REST的創建者):

REST APIS must be hypertext driven

換句話說,如果應用程序狀態(並因此使API) 發動機沒有被驅動通過超文本,那麼它不能是RESTful,也不能是REST API。期。

此外,從該職位的討論是一個RESTful應用例:Lost Boys's Spam-E REST Application