我正在構建一個圍繞我自己的API的項目,目前爲止一切正常,但我想介紹DELETE的UNDO操作。如何撤消DELETE操作並遵守RESTful標準?
到目前爲止,DELETE這樣工作:
DELETE /聯繫人/:ID
我最初雖爲UNDO是調用同一個URL相同DELETE,這將取消該刪除的狀態(如果此聯繫人處於刪除狀態),但我不知道這是否是一種好方法。
我讀this post看起來很相似,但「結賬」部分給出了我所尋找的其他東西。
我的建議很好還是有更好的方法?
感謝您的幫助。
我正在構建一個圍繞我自己的API的項目,目前爲止一切正常,但我想介紹DELETE的UNDO操作。如何撤消DELETE操作並遵守RESTful標準?
到目前爲止,DELETE這樣工作:
DELETE /聯繫人/:ID
我最初雖爲UNDO是調用同一個URL相同DELETE,這將取消該刪除的狀態(如果此聯繫人處於刪除狀態),但我不知道這是否是一種好方法。
我讀this post看起來很相似,但「結賬」部分給出了我所尋找的其他東西。
我的建議很好還是有更好的方法?
感謝您的幫助。
如果您已刪除使用DELETE
後續請求的資源應該返回404 NOT FOUND
或410 GONE
因爲不再有資源有接受請求的資源。
如果可以接受,並且您的狀態可用,最簡單的答案是通過在已刪除資源的URL處發佈PUT
來簡單地重新創建資源。在語義上,這會創建一個新的資源,替換任何現有的狀態,而不是真正的撤消刪除。
另一個簡單的解決方案是承認你並沒有真正刪除資源,只是以某種方式改變它們的狀態以顯示它們已被歸檔。這意味着您不能使用動詞DELETE
,但可以向資源發出PUT
或POST
請求,以在存檔狀態和活動狀態之間切換。
如果您想保留DELETE
爲您消除記錄的手段,那麼一個選擇是使人們有可能通過使用特殊的show-archived
值的訪問已歸檔資源:
GET /contacts/<id>?show-archived=true
上指定此歸檔資源將在歸檔資源上返回200
,而不是40X
代碼之一。這有點麻煩,因爲你的資源現在有一個「超級」的問題,出現既存在又不存在,取決於你如何觀察它們。但是,這意味着您可以向資源請求更新其狀態:
PUT /contacts/<id>?show-archived=true
State=Active
... all other unchanged fields ...
我個人將使UNDO DELETE
一個PUT
在資源如果deletion state
是代表性的一部分,如果沒有上action
一個POST
。
這action
會是什麼樣子:
POST /contact/id/action/[recover|reactivate] (or whatever you think is more descriptive for the action).
但是,這只是我認爲是符合RESTFul
最方式。
顯然,在url中使用動詞也不是REST的標準。動詞只能在方法 –
中感謝您的評論 – ssedano
+1 - 另一個細微變化是PATCH,因爲您在邏輯上只是更新資源的一部分(在這種情況下,它已被刪除/存檔狀態) – bryanmac
'PATCH' would非常適合這種類型的請求,但對其的支持各不相同;對於HTTP動詞家族來說這是相當新穎的。 –