2014-10-28 64 views
0

我重讀了HTTP規範。當PUT是無操作時,HTTP服務器應該返回200嗎?

它聲明如果已經創建了資源,PUT應該被視爲修改的請求。

它聲明PUT在成功時應該返回200或204,但不會創建資源。

它聲明PUT應該是冪等的,並且在使用相同的相同請求多次調用時不會產生不需要的副作用

它似乎沒有說明的是, -PUT應該返回成功,當它是一個冪等的場景,沒有副作用,並且只有成功(而不是例如409衝突響應服務器檢測到無操作PUT請求服務器不允許禁止操作的地方)。

我的問題是,最好的辦法是什麼? 或者:

  1. 我錯過了什麼嗎?無論是在HTTP規範還是其他衆所周知的REST準則中,我沒有看到什麼?

  • 假設你知道沒什麼我錯過了,你有什麼關於200是否應該是HTTP的意見,建議的行爲嗎?爲什麼?你能想到有什麼好的理由不會爲了沒有操作而返回200/204嗎?
  • +0

    如果你的系統中沒有任何操作(我假設你的意思是指一個現有資源沒有真正改變其值)的PUT是'成功',它應該返回200.我沒有看到任何東西在你的除此之外的引文。 – EJP 2014-10-28 22:57:51

    +0

    所有其他2xx代碼在你的情況下絕對沒有意義,所以200或204似乎可以 – 2014-10-28 23:01:40

    +0

    基本上是啊,它不會改變價值,我不明白爲什麼這不會被視爲成功..除非有人有一個很好的論點?:) – 2014-10-30 18:50:21

    回答

    2

    是的,你應該返回200或204

    首先,PUT不被視爲修改現有的資源的請求。您可能正在閱讀RFC 2616,這在RFC 7231上已經過時。 PUT始終是的請求,將替換爲給定URI處的資源,但在RFC 2616中這不是很清楚。如果它已經存在,paylod應該是相同資源的修改版本,但操作仍然是一個完整的替代,而不是一個修改。

    從這個意義上說,沒有這樣的東西,因爲即使通過完全相同的東西,你也總是替換那個URI所標識的東西。從客戶角度來看是否發生了變化是無關緊要的。對於服務器來說,重要的是整個事情被取代了。作爲一般規則,GET,PUT,PATCH和DELETE方法的語義應該很容易推廣到任何東西,如果你通過別的東西添加了一些已經可用的語義,你可能會做一些事情錯誤。要在無操作請求上返回一個錯誤,因爲如果客戶需要的話,資源不會發生變化,那麼可以使用前提條件頭來實現,所以將它作爲PUT語義的一部分是沒有意義的。

    +0

    由於RFC規範的確切字「如果目標 資源確實有一個當前的表示形式,並且該表示形式 已成功_modified_」我認爲它仍然不是100%清楚,但我同意,我希望它具有你給它的同樣的解釋,你關於先決條件標題的論點也是非常有意義的。 – 2014-10-30 18:53:50

    +0

    順便說一句,我正在閱讀舊的RFC。謝謝! – 2014-10-30 18:54:53

    相關問題