天天看點

HTTP 兩次 DELETE 同一個資源應該傳回什麼

在實踐 RESTful API 設計的時候,會碰到很多需要選擇的地方。而這些在 RFC 7230 - 7235 裡面沒有說明。例如這次要說的 DELETE 方法。

根據 RFC 7231 的說法, DELETE 是幂等的。

幂等(idempotent)是什麼?在 RFC 7231 定義幂等方法的時候,是這樣說的:

A request method is considered "idempotent" if the intended effect on the server of multiple identical requests with that method is the same as the effect for a single such request. —— RFC 7231

如果使用同一種請求方法的多個等效請求對伺服器的預期影響,與一個等效請求對伺服器的預期影響一樣,那麼這種請求方法被認為是幂等的。

DELETE 幂等帶來了什麼問題?

問題是:多次使用 DELETE 方法作用于同一個資源,除了第一個成功對服務端造成影響(删除了資源)的請求,其他請求應該傳回什麼狀态碼?

針對這個問題,有兩種觀點。一種觀點認為應該傳回 404 Not Found;另一種觀點認為應該傳回 2xx 狀态碼。

第一種觀點的理由是:

不能删除一個不存在的資源,因為它已經不存在了。而表示資源不存在的狀态碼是 404,應該傳回 404 Not Found。

第二種觀點的理由是:

用戶端删除一個資源的意圖是使得該資源不存在或者不可用。那麼删除一次還是多次,都會讓服務端對于該資源處于同一個狀态。無論是用戶端還是服務端,都認為這個結果是合理的,是以應該傳回成功的狀态碼。

從經驗上來看,我贊成第二種觀點。

傳回 4xx 會有什麼問題?

在項目中,我們需要調用其他系統的 API 來操作資源。在某些場景下當多次調用删除同一個資源的 API 時,第一個響應是删除成功,但後續響應都是資源不存在的錯誤。

這個時候應該認為執行成功還是執行失敗?

如果認為成功,那麼應該捕獲這個異常并且不做任何處理。既然我不需要做任何處理,為何服務端不傳回成功的狀态碼呢?

如果認為失敗,那麼應該捕獲異常并且做處理。但是要處理什麼呢?“使服務端的該資源不存在” 明明就是預期的結果,卻還要做錯誤處理。這讓人很沖突。

服務端傳回 404 暴露了對該請求的處理方式,而用戶端并不關心這個資訊。用戶端隻想要該資源不再存在,即使該資源從未存在過。如果執行過後,該資源确實不存在了,就達到了用戶端的目的。應該告訴用戶端成功的消息。

應該傳回什麼狀态碼?

  1. 如果操作立即成功,且無需給用戶端更多的資訊,則傳回 204 No Content
  2. 如果操作立即成功,且需要給用戶端更多的資訊,則傳回 200 OK 并在響應體裡附帶資訊
  3. 如果操作被接受了,但可能需要比較長的時間才能執行結束,則傳回 202 Accepted

多次操作成功是否應該傳回不同的成功狀态碼?

有這個考慮是因為要識别這個删除成功的狀态究竟是否由這一次請求所造成的。

但絕大多數情況下,并不關心這一點。是以傳回同一個狀态碼就行了。

HTTP 兩次 DELETE 同一個資源應該傳回什麼

本文采用知識共享署名 2.5 中國大陸許可協定進行許可。歡迎轉載,演繹或用于商業目的,但是必須保留本文的署名 schaepher(包含連結)。如您有任何疑問或者授權方面的協商,請給我留言。

上一篇: 後端的優化

繼續閱讀