2009-04-28 114 views

回答

435

HTTP規範(RFC 2616)有許多適用的建議。下面是我的解釋:

  • 的更新的成功PUT到 現有資源HTTP狀態代碼200 OK。沒有反應機構需要。 (每Section 9.6204 No Content是更合適的。)新 資源的成功PUT
  • HTTP狀態代碼201 Created,用最具體的URI新資源在Location頭字段中返回和其他相關的URI和元數據的資源在響應主體中回顯。用於PUT是不成功的,因爲 到3 RD三方修飾(RFC 2616 Section 10.2.2
  • HTTP狀態代碼409 Conflict,具有的差異列表 嘗試更新,並在響應 體當前資源之間。 (RFC 2616 Section 10.4.10
  • HTTP狀態代碼400 Bad Request對於不成功的 PUT,在響應主體 中使用自然語言文本(例如英語)來解釋PUT失敗的原因。(RFC 2616 Section 10.4
+22

@stian有趣!對於Mozilla來說,這看起來非常冒失,因爲我在RFC 2616中找不到任何東西(特別是[10.2成功2xx](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2 )和[10.2.1 200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1)),特別排除使用'200'作爲PUT,DELETE,或任何其他方法。我錯過了什麼?比如Mozilla成爲W3和IETF的老大? ;或者也許他們從未聽說過Postel的魯棒原則。 – 2013-01-24 22:26:49

+48

@stian:2013年2月3日刪除了該句子。可能是因爲有人在此處閱讀了此文。 ;)https://developer.mozilla.org/en-US/docs/HTTP/HTTP_response_codes$compare?from=346227&to=351003 – 2013-04-10 21:15:43

+4

PUT方法的語義是忽略資源所處的當前狀態,因此要返回如果請求是有條件的,則由於第三方修改而不成功的PUT的409衝突纔有意義。 – 2014-06-17 19:07:32

-3

理想情況下,它會返回成功/失敗響應。

+11

不在響應正文中。 HTTP狀態代碼就是這個地方。也許如果有錯誤,可能會在響應中返回一些擴展錯誤信息bidy – 2009-04-28 13:13:05

-2

似乎沒問題...雖然我會認爲一個基本的成功/失敗/時間張貼/#字節收到/等指示。將是可取的。

編輯:我一直在思考數據完整性和/或記錄保存的問題;諸如MD5散列之類的元數據或接收時間的時間戳可能對大型數據文件有幫助。

+1

狀態響應頭中的200 OK如何?請認爲這足以說,「工作很好,謝謝?」 – AnthonyWJones 2009-04-28 13:11:29

+0

響應頭將包含狀態碼,是的,我們現在正在談論HTTP: – AwkwardCoder 2009-04-28 13:12:12

2

HTTP/1.1 spec(第9.6節)討論了適當的響應/錯誤代碼。但它沒有解決響應內容。

您會期待什麼?一個簡單的HTTP響應代碼(200等)對我來說看起來簡單明瞭。

-3

就像一個空的請求主體符合GET請求的原始目的,並且空響應主體符合PUT請求的原始目的。

-2

HTTP響應的標頭和正文之間有區別。 PUT不應該返回一個body,但是必須在header中返回一個響應代碼。如果成功,請選擇200;如果不成功,則選擇4xx。沒有空返回碼這樣的事情。你爲什麼想這樣做?

89

與這裏的大多數答案相反,我實際上認爲PUT應該返回更新的資源(當然除了HTTP代碼之外)。

您希望將資源作爲PUT操作的響應返回的原因是因爲當您向服務器發送資源表示時,服務器也可以對該資源應用一些處理,因此客戶想知道請求成功完成後,此資源如何看起來如何。 (否則它將不得不發出另一個GET請求)。

+2

「服務器也可以對此資源應用一些處理」:我是新來的這個。這真的是RESTful嗎? – Raedwald 2012-08-28 22:02:06

+12

@雷德沃爾德確定它是。雖然通常推薦使用REST,但並不要求*整個*資源在PUT上更新。有些字段可能沒有意義更新 - 創建日期或上次修改日期,例如,可能不應包含在PUT正文中,但可能會因PUT而更改。有人說過,我不同意LiorH說PUT會導致資源迴歸;在PUT之後我會需要一個GET來獲取更新的資源。 – Randolpho 2012-10-08 21:16:55

+9

@Randolpho _REST不需要在PUT_上更新整個資源,這不應該是PATCH的情況嗎? – 2013-10-14 08:37:19

3

對於「已創建」和「位置」標頭的201的Http響應代碼指向客戶端可以找到新創建的資源的位置。

+9

PUT請求已指定位置。 – Derecho 2012-11-29 06:07:05

+3

PUT對象不是(或不應該是)新創建的資源 – kdazzle 2013-11-01 17:44:53

+1

爲什麼所有的downvotes?這是一個很好的答案。 – 2014-06-18 16:43:02

1

我認爲服務器可以響應PUT返回內容。如果您使用的是允許側載數據的響應信封格式(例如ember-data所使用的格式),那麼您還可以包括可能已經通過數據庫觸發器等修改過的其他對象。(Sideloaded data is explicitly reduce #請求,這似乎是一個優化的好地方。)

如果我只接受PUT並沒有任何可報告的內容,我使用狀態碼204而沒有正文。如果我有要報告的內容,我使用狀態碼200,幷包含一個正文。

1

我在我的服務中使用了RESTful API,這裏是我的意見: 首先我們必須得到一個共同的觀點:PUT用於更新資源而不是創建或獲取。

我定義的資源用:Stateless resourceStateful resource

  • 無國籍資源 對於這些資源,只是空的身體返回HttpCode,這是不夠的。

  • 有狀態資源 例如:資源的版本。對於這種資源,當您想要更改它時,您必須提供版本,因此請返回完整資源或將版本返回給客戶端,以便客戶端在更新操作後不需要發送獲取請求。

,對於一個服務或系統,保持simpleclearlyeasy to use and maintain是最重要的事情。

相關問題