2008-11-12 69 views
11

我們有一個REST API,客戶端通常將POST和PUT數據發送到該API。當他們這樣做時,有時他們發佈的數據導致我們的系統沒有任何變化。 POST和PUT格式良好,但他們發送的數據與我們數據庫中的數據完全相同。發生這種情況時,我發現我們正在返回400 HTTP狀態。不幸的是,這意味着「錯誤的請求」,如「服務器由於語法格式不正確而無法理解的請求」。REST:對於被忽略的POST的正確HTTP響應代碼

很明顯,情況並非如此,但我被告知我們將使用這個,因爲沒有其他適當的狀態代碼。我們考慮的選擇:

  • 304未修改。遺憾的是,這僅適用於GET請求。
  • 204無內容。似乎關閉,但禁止一個實體。

其他選擇似乎同樣糟糕。我們可能會使用200 OK,並在我們返回的XML文檔中提供相關信息,但這看起來不是很「RESTish」。 REST世界通常如何處理這個問題?

(固定未修改響應代碼。謝謝Mkoeller)

+0

HTTP狀態302被命名爲「找到」。 – mkoeller 2008-11-12 14:02:45

回答

17

我認爲在這種情況下返回200 OK是完全正確的,數據被正確處理並且服務器做了它所要做的。由於服務器正確處理了數據,它應該返回一個OK狀態碼。它在內部忽略它的事實是或不應該是無關緊要的。

服務器對數據做了什麼不應該告訴客戶端,他們應該被告知發生了什麼請求(處理好,發生錯誤等)。

如果出於某種奇怪的原因(我想不出一個有效的原因),它是客戶的興趣,你有反應告訴他們。

1

從客戶機查看服務器狀態是相同的,如果該請求的內容是服務器上的相同與否,是嗎?由於服務器事後嚴格保存已發送的內容,爲什麼服務器應對任何錯誤狀態? 另一方面,如果請求內容與服務器已知的內容相同,客戶端爲什麼要打擾呢?它已成功傳輸到服務器,因此大部分工作已完成。如果客戶在這種情況下有不同的響應代碼,客戶會如何反應?

結論:您的請求內容與現有內容相同的情況並非特例。您應該使用相同的響應狀態代碼進行響應。這可能是200,302或303.

2

如果客戶端在PUT之前能夠知道服務器上的內容的實體標記,那麼就存在與您描述的情況完全相同的If-Match標頭和412 Precondition Failed響應。

+0

你的意思是`If-None-Match` – 2010-05-08 20:05:22