2009-11-21 100 views
5

http://kenai.com/projects/suncloudapis/pages/Home的Sun Cloud API是RESTful API遵循的一個很好的示例。誠如RESTful原則,當您獲取資源時,您只能獲得該資源的表示形式。RESTful API的Mimetypes

響應中的Content-Type標頭準確告訴您該資源的類型,例如application/vnd.com.sun.cloud.Snapshot + json。 Sun已經向IANA註冊了這些mimetypes。

目前這種情況通常如何實用?我見過的大多數API都使用了「application/json」的Content-Type。這告訴你,響應是JSON,但沒有更多關於它。你必須在JSON對象中有一些東西,比如「type」屬性,才能知道它是什麼。我正在設計一個RESTful API(它不會公開,因此我不會註冊mimetypes)。我一直在使用RESTEasy,我發現即使我指定了一個完整的mimetype,響應頭中的Content-Type也是Accept請求頭指定的內容。如果請求默認請求「application/* + json」,則響應頭將具有「application/* + json」。我可以通過在響應消失之前更改標題來解決此問題,但是我應該嘗試這麼做嗎?還是應該像請求一樣有一個通配符?

還是應該像大多數API一樣提供「application/json」似乎要做?

更多的想法後說:

提出這個問題的另一種方式是:我應該使用HTTP的協議,或者我應該用HTTP只是作爲傳輸機制來包裝我自己的協議?

要使用HTTP作爲協議,響應的實體主體包含請求的對象的表示(或者錯誤消息對象的表示),「Content-Type」標題包含對象的確切類型,並且「狀態」標題包含成功或錯誤代碼。

要使用HTTP作爲傳輸機制,「狀態」標題始終設置爲200 OK,「Content-Type」類似於「application/json」,並且實體主體包含自身具有的內容一個對象,一個對象類型,一個錯誤代碼和任何你想要的東西。如果你自己的協議是RESTful的,那麼整個方案就是RESTful。 (HTTP是RESTful協議,但不是唯一可用的協議。)

您自己的協議對所有傳輸層都是不透明的。如果你使用HTTP作爲協議,所有的傳輸層都會理解它,並可能做你不想要的東西;比如瀏覽器會攔截一個「401 Unauthorized」響應,並建立一個登錄對話框,即使你想自己處理。

回答

2

還是應該像大多數API一樣提供「application/json」似乎要做?

我不這麼認爲。

媒體類型是耦合的REST風格的Web應用程序,使用它的客戶端之間的唯一點。您的媒體類型的文檔是您的API的文檔。您的媒體類型是您的客戶和您的應用程序之間的合同。消除特定的媒體類型,並消除使REST可用的重要元素。

Sun公司已經註冊這些MIME類型與IANA。

找不到any mention of that here。 AFAIK,沒有必要實際向IANA註冊您的自定義媒體類型。該慣例似乎是使用application/vnd.com.example.app.foo + json的反向域名錶示法,它可防止名稱空間衝突。如果媒體類型變得穩定和公開,這可能是一個好主意,但沒有要求。雖然這可能是錯誤的。

+0

我對Web客戶端的一個問題是瀏覽器攔截HTTP狀態代碼和標頭。例如,如果您返回401 Unauthorized,那麼JavaScript客戶端在瀏覽器抓取它並建立自己的登錄對話框之前不會看到它。從此,瀏覽器在每個請求上都放置自己的授權標頭。 Mimetypes通過OK,但至少有一個狀態碼(401)是一個問題。 – 2009-11-23 14:10:34

0

你會通過指定一個完整的mimetype獲得任何價值嗎?如果mimetype是application/json,你會對完整的mime類型做什麼不同嗎?

我的2美分 - 如果API不公開,那麼我看不到完整的mimetype的原因。應用程序/ json的MIME類型應該綽綽有餘。您已經知道響應正在返回的json類型。如果API最終成爲公衆,那麼擔心一個完整的MIME類型......或者讓人們弄清楚它。

+0

正如Rich提到的,mime類型是您的合同。應用程序的整個語義值都包含在MIME類型中。如果您只提供application/json,那麼客戶端可以從您的數據中獲得非常小的價值,而不會引入帶外耦合,這正是REST試圖阻止的。 – 2009-11-22 02:21:34

4

我用我自己的vnd.mycompany.mymediatype + xml的媒體類型爲許多我的表示。在客戶端上,我根據返回的表示的媒體類型分派到相應的控制器類。這確實允許服務器控制我的客戶端應用程序的行爲,以響應用戶關注鏈接。

就我個人而言,如果您希望支持REST客戶端,我相信使用application/xml和application/json是最糟糕的選擇之一。唯一的例外是客戶端只使用下載的代碼(如Javascript)來解釋數據。