我想知道人們的意見是什麼RESTful'PUT'操作在響應正文中不返回任何內容(空)?RESTful'PUT'操作應該返回什麼
回答
HTTP規範(RFC 2616)有許多適用的建議。下面是我的解釋:
- 的更新的成功PUT到 現有資源HTTP狀態代碼
200 OK
。沒有反應機構需要。 (每Section 9.6,204 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)
理想情況下,它會返回成功/失敗響應。
不在響應正文中。 HTTP狀態代碼就是這個地方。也許如果有錯誤,可能會在響應中返回一些擴展錯誤信息bidy – 2009-04-28 13:13:05
似乎沒問題...雖然我會認爲一個基本的成功/失敗/時間張貼/#字節收到/等指示。將是可取的。
編輯:我一直在思考數據完整性和/或記錄保存的問題;諸如MD5散列之類的元數據或接收時間的時間戳可能對大型數據文件有幫助。
狀態響應頭中的200 OK如何?請認爲這足以說,「工作很好,謝謝?」 – AnthonyWJones 2009-04-28 13:11:29
響應頭將包含狀態碼,是的,我們現在正在談論HTTP: – AwkwardCoder 2009-04-28 13:12:12
HTTP/1.1 spec(第9.6節)討論了適當的響應/錯誤代碼。但它沒有解決響應內容。
您會期待什麼?一個簡單的HTTP響應代碼(200等)對我來說看起來簡單明瞭。
就像一個空的請求主體符合GET請求的原始目的,並且空響應主體符合PUT請求的原始目的。
HTTP響應的標頭和正文之間有區別。 PUT不應該返回一個body,但是必須在header中返回一個響應代碼。如果成功,請選擇200;如果不成功,則選擇4xx。沒有空返回碼這樣的事情。你爲什麼想這樣做?
與這裏的大多數答案相反,我實際上認爲PUT應該返回更新的資源(當然除了HTTP代碼之外)。
您希望將資源作爲PUT操作的響應返回的原因是因爲當您向服務器發送資源表示時,服務器也可以對該資源應用一些處理,因此客戶想知道請求成功完成後,此資源如何看起來如何。 (否則它將不得不發出另一個GET請求)。
「服務器也可以對此資源應用一些處理」:我是新來的這個。這真的是RESTful嗎? – Raedwald 2012-08-28 22:02:06
@雷德沃爾德確定它是。雖然通常推薦使用REST,但並不要求*整個*資源在PUT上更新。有些字段可能沒有意義更新 - 創建日期或上次修改日期,例如,可能不應包含在PUT正文中,但可能會因PUT而更改。有人說過,我不同意LiorH說PUT會導致資源迴歸;在PUT之後我會需要一個GET來獲取更新的資源。 – Randolpho 2012-10-08 21:16:55
@Randolpho _REST不需要在PUT_上更新整個資源,這不應該是PATCH的情況嗎? – 2013-10-14 08:37:19
我認爲服務器可以響應PUT返回內容。如果您使用的是允許側載數據的響應信封格式(例如ember-data所使用的格式),那麼您還可以包括可能已經通過數據庫觸發器等修改過的其他對象。(Sideloaded data is explicitly reduce #請求,這似乎是一個優化的好地方。)
如果我只接受PUT並沒有任何可報告的內容,我使用狀態碼204而沒有正文。如果我有要報告的內容,我使用狀態碼200,幷包含一個正文。
我在我的服務中使用了RESTful API,這裏是我的意見: 首先我們必須得到一個共同的觀點:PUT
用於更新資源而不是創建或獲取。
我定義的資源用:Stateless resource
和Stateful resource
:
無國籍資源 對於這些資源,只是空的身體返回HttpCode,這是不夠的。
有狀態資源 例如:資源的版本。對於這種資源,當您想要更改它時,您必須提供版本,因此請返回完整資源或將版本返回給客戶端,以便客戶端在更新操作後不需要發送獲取請求。
但,對於一個服務或系統,保持simple
,clearly
,easy to use and maintain
是最重要的事情。
- 1. WEB API操作方法的返回類型應該是什麼?
- 2. javascript類應該顯式返回什麼?
- 3. 這些比較應該返回什麼?
- 4. 返回類型應該是什麼?
- 5. 什麼應該dynamicType在Swift中返回?
- 6. Dijkstra的算法應該返回什麼?
- 7. 爲什麼Mockito的模擬返回0時應該返回null?
- 8. 該查詢的返回類型應該是什麼?
- 9. - [NSOperationQueue操作]應該不會返回一個空數組?
- 10. 爲什麼返回操作不起作用?
- 11. 將刪除操作從Web移動到MVC應用中的服務層 - 它應該返回什麼?
- 12. 應用數據REST服務器API應該返回什麼?
- 13. XOR操作返回
- 14. 對於返回void的函數,什麼是無操作符操作符?
- 15. 爲什麼該查詢返回與空
- 16. 如果我不關心返回值,我應該聲明什麼返回類型?
- 17. SQL服務器:標量函數返回什麼,但它應該返回INT
- 18. 什麼應該是返回xml字符串的方法的返回類型?
- 19. 爲什麼我的JS應該返回一個對象返回undefined?
- 20. 爲什麼應該(或不應該)搜索查詢只返回文檔ID?
- 21. 爲什麼unordered_set操作像count和erase返回size_type?
- 22. 三元操作「?:」的返回值是什麼?
- 23. C#mysql command.ExecuteNonQuery返回什麼?如果它的刪除操作
- 24. IObservable.Create的subscribe參數實際返回的操作是什麼?
- 25. 什麼等待異步操作方法的返回?
- 26. 爲什麼JavaScript爲「邏輯與」操作返回空字符串?
- 27. 爲什麼重載操作符需要返回=對象?
- 28. 爲什麼這些操作數返回False?
- 29. 爲什麼Elixir中的Rem操作符返回負數?
- 30. 爲什麼我的模擬器中按位操作返回0?
@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
@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
PUT方法的語義是忽略資源所處的當前狀態,因此要返回如果請求是有條件的,則由於第三方修改而不成功的PUT的409衝突纔有意義。 – 2014-06-17 19:07:32