2015-12-04 262 views
6

A PUT請求可以有很多結果,我想知道哪個狀態代碼對每個請求都是最好的。PUT的HTTP狀態代碼

說我想創建一個新的資源,所以我做這樣的事情:

PUT http://example.com/resources/resource-1 

而且由於新的資源已創建我會得到一個HTTP 201

現在我想更新這個資源,所以我做了同樣的要求,以新的內容:

PUT http://example.com/resources/resource-1 

我也得到HTTP 200HTTP 204,因爲資源已被更新。但是如果我再次發送相同內容的請求,該怎麼辦?即使沒有更新,服務器是否應該返回HTTP 200HTTP 204

我知道,HTTP 200HTTP 204都只是表示請求已成功處理,即使數據不改變請求仍然可以(和應該)仍然可以成功處理。但是有沒有辦法告訴客戶端請求已經成功處理,但服務器端沒有任何改變?如果有,是否應該用於PUT請求? PUT是冪等性的,根據服務器端的實際處理情況是否應該返回不同的狀態(只要在這個處理過程中沒有錯誤發生)?

回答

6

但有沒有辦法告訴客戶端請求已成功處理,但在服務器端沒有改變?

是的,但這不是狀態碼的用途。

返回200 OK和實體的表示,或者204沒有內容並返回任何內容。

對於沒有應用的更改,請使用類似ETag的標頭。客戶可以將ETag與先前的值進行比較,並確定沒有任何變化。

+0

如果資源在第一個PUT請求中返回201,但在後續請求中返回200或204,那麼它是否會違反冪等性(對於PUT是必需的)? – Ray

+1

@ Ray no,因爲idempotence是關於server_上的結果,或者更具體地說是由請求URL標識的資源的字節內容,而不是關於響應消息的內容。服務器上的結果在相同資源的連續PUT上不會更改。 :)請看例如:[_「請注意,雖然冪等操作在服務器上產生相同的結果(無副作用),但響應本身可能不一樣(例如資源狀態可能會在請求之間改變)」_](http ://www.restapitutorial.com/lessons/idempotency.html)。 – CodeCaster

+0

呃......感謝您的澄清 - 完全有道理。 – Ray