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