在RESTful API(以HTTP方式)中表示一次性可寫資源的慣用方式是什麼?在CRUD術語中,應該可以創建資源但不允許更新?RESTful API - 一次性寫入資源
編輯:
我想補充的澄清下面Rosenheimer的答案的評論。我希望允許客戶端指定URL而不是由POST
處理程序生成。
在RESTful API(以HTTP方式)中表示一次性可寫資源的慣用方式是什麼?在CRUD術語中,應該可以創建資源但不允許更新?RESTful API - 一次性寫入資源
編輯:
我想補充的澄清下面Rosenheimer的答案的評論。我希望允許客戶端指定URL而不是由POST
處理程序生成。
如果之前資源不存在(表示「一次寫入」實際上是資源的「創建」),那麼只需調用父項即可,如POST
,如下所示:POST example.com/Resources
發送資源。 稍後,不要允許PUT
或PATCH
到位於example.com/Resources/123
的特定資源,其中123
將是資源的標識符。
因此,該資源可以寫入一次,但以後不能更改。
同意「一次可寫」實際上是「創作」。 但我希望客戶端能夠指定URL - 即客戶端是否可以說「在此特定URL上創建資源或在該URL已被佔用時失敗」? 在POST正文中指定URL並不困難,但我想知道是否可以純粹用HTTP來表示它。 –
當然,您也可以像前面所說的那樣,在資源本身中包含資源的標識符(作爲正文中對象的屬性),或者將其包含爲像這樣的URL參數:POST example.com/Resources ?ID = 123;然後這可以用201-創建或423-鎖定來響應 – GeorgDangl
您可以使用HTTP狀態405 Method Not Allowed
或403 Forbidden
來禁止後續更新。
資源創造一些使用POST
:
# C of CRUD
POST ./phones -> 200 OK with the id of the object created
# R or CRUD
GET ./phones/{id}
# U of CRUD
PATCH/PUT ./phones/{id}
# D of CRUD
DELETE ./phones/{id}
一些可以使用PUT
創建對象,但使用PUT
的問題是,該方法具有客戶端2含義。
PUT具有將被調用的URI所引用的實體替換爲在請求內找到的有效載荷的語義 - 沒有什麼更多的了。如果實體還不可用,只有'PUT'具有與'POST'類似的語義,儘管它仍然用請求中找到的內容「替換」當前內容。 –
@RomanVottner是當使用PUT創建資源並替換資源時,仍然存在2種不同的事情。在同一個方法中同時具有語義的同時給了很多麻煩。從客戶角度來看,行爲不太清楚。 – mathk
不!語義只是將請求中應包含的內容替換爲請求中包含的內容。如果有更新或創建與'PUT'不相關。效果是重要的。在請求結束時,被調用的URI表示的資源必須具有請求主體的內容。 –
我認爲正確的做法是接受PUT
方法首次保存資源並在任何後續嘗試更新已有資源時返回409衝突HTTP狀態碼。
雖然'PUT'應該是這樣,這不是冪等的。 –
我收回。似乎沒有擴展到響應代碼。但是,我認爲在PUT正文與當前內容匹配的情況下,返回204會更好,而不是失敗。 –
你會使用什麼樣的約定? PUT ./resources/{id}創建? – mathk
我覺得我更喜歡'PUT'到'POST',因爲它感覺語義上更好。但我懷疑「一次寫入」語義並不是冪等的。 –
是的你是對的。沒有明顯的迴應你的問題。您始終可以使用4xx響應狀態進行回覆。但從客戶角度來看,這並不容易。因此,我建議您僅使用POST進行創建並禁止PUT/PATCH。 – mathk