2014-09-23 36 views
1

我試圖設計一個REST API,其中:如何查找URI後面的資源類型?

  1. 客戶發出HTTP DELETE /users/5
  2. 操作失敗,HTTP 409 ("CONFLICT")Location標頭指向必須首先刪除的依賴資源(例如,由用戶創建的錯誤報告)。我選擇不自動級聯刪除。

因爲HTTP 409 ("CONFLICT")響應可以在多種類型的資源的時候,我需要爲客戶查找返回該資源的類型(爲保證系統理解什麼是被刪除的方式,而不是propgating刪除威利-nilly)。

什麼是適當的行動?客戶有沒有方法可以列舉URI的可用?客戶是否應該調用HTTP HEAD WITH Accept: */*並將結果Content-Type與已知類型的列表進行比較?

回答

0

你在做什麼是有點噁心。該規範僅建議使用201和3xx響應的位置標題。此外,409(衝突)迴應說:

在這種情況下,響應表示可能會包含合併基礎上修訂 歷史的差異有用 信息。
        - RFC 7231, Section 6.5.8

像他們主張用實體來解釋的矛盾,而不是Location頭聽起來給我。

+0

這不完全正確。你引用的句子適用於他們正在討論的具體例子。如果你閱讀上面的內容(對於一般情況),他們寫道:「服務器應該生成一個有效載荷,其中包含足夠的信息以供用戶識別衝突的來源。」有效載荷「並不單指主體。它還包括標題。所以回顧一下,使用'Location'標題沒有任何問題。 這就是說,你是否建議我使用response body同時返回一個'Content-Type'和'URI'? – Gili 2014-09-24 06:57:22

+0

@Gili位置標題(7.1.2)的文本提到201和3xx響應,但不包含其他任何響應。我沒有說這是錯的,只是狡猾。沒有IANA註冊的頭文件(http://www.iana.org/assignments/message-headers/message-headers.xhtml)允許位置內容類型。我不是自定義標題的粉絲,因爲中介可以剝離它們。如果你能負擔得起HEAD呼叫,我認爲這比有效載荷主體路線更正確,但是我的大部分客戶都不願意接聽額外的呼叫。 – 2014-09-24 14:08:14

+0

如果你忽略Accept頭,是否允許'HEAD'返回'HTTP 303(「Multiple Choices」)?也許這比'Accept:*/*'更好,它將返回許多表示之一... – Gili 2014-09-24 22:46:08