2013-05-30 21 views
5

我正在構建一個圍繞我自己的API的項目,目前爲止一切正常,但我想介紹DELETE的UNDO操作。如何撤消DELETE操作並遵守RESTful標準?

到目前爲止,DELETE這樣工作:

DELETE /聯繫人/:ID

我最初雖爲UNDO是調用同一個URL相同DELETE,這將取消該刪除的狀態(如果此聯繫人處於刪除狀態),但我不知道這是否是一種好方法。

我讀this post看起來很相似,但「結賬」部分給出了我所尋找的其他東西。

我的建議很好還是有更好的方法?

感謝您的幫助。

回答

5

如果您已刪除使用DELETE後續請求的資源應該返回404 NOT FOUND410 GONE因爲不再有資源有接受請求的資源。

如果可以接受,並且您的狀態可用,最簡單的答案是通過在已刪除資源的URL處發佈PUT來簡單地重新創建資源。在語義上,這會創建一個新的資源,替換任何現有的狀態,而不是真正的撤消刪除。

另一個簡單的解決方案是承認你並沒有真正刪除資源,只是以某種方式改變它們的狀態以顯示它們已被歸檔。這意味着您不能使用動詞DELETE,但可以向資源發出PUTPOST請求,以在存檔狀態和活動狀態之間切換。

如果您想保留DELETE爲您消除記錄的手段,那麼一個選擇是使人們有可能通過使用特殊的show-archived值的訪問已歸檔資源:

GET /contacts/<id>?show-archived=true 

上指定此歸檔資源將在歸檔資源上返回200,而不是40X代碼之一。這有點麻煩,因爲你的資源現在有一個「超級」的問題,出現既存在又不存在,取決於你如何觀察它們。但是,這意味着您可以向資源請求更新其狀態:

PUT /contacts/<id>?show-archived=true 

State=Active 
... all other unchanged fields ... 
+1

+1 - 另一個細微變化是PATCH,因爲您在邏輯上只是更新資源的一部分(在這種情況下,它已被刪除/存檔狀態) – bryanmac

+0

'PATCH' would非常適合這種類型的請求,但對其的支持各不相同;對於HTTP動詞家族來說這是相當新穎的。 –

1

我個人將使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最方式。

+0

顯然,在url中使用動詞也不是REST的標準。動詞只能在方法 –

+0

中感謝您的評論 – ssedano