2009-06-23 32 views
6

我正在開發一個REST API,我想知道以下幾點:使用HTTP PUT,但不能完全代替實體

我想使用HTTP PUT來更新web服務的一些實體。格式將是一個urlencoded主體。只更新實際指定的字段而不是整個實體是否可以接受?

我在問,因爲PUT會是一個非常方便的方法來做一些更新,但我不希望他們刪除字段,如果他們碰巧拼錯了其中的一些。此外,我不想強​​制實施者總是先做一個GET,然後複製他們實際上可能沒有使用的每一個字段。

回答

2

放置僅用於完全替換。有一個建議動詞PATCH來解決你所遇到的問題(http://www.ietf.org/internet-drafts/draft-dusseault-http-patch-14.txt

但是,修補程序仍可能不是你想要的。發送的是一個更新資源,可以執行增量計數器等操作,因此,與put不同,它不是冪等的。

您可以將每個字段公開爲資源並對每個字段進行多次放入。你可以通過pipeline來緩解額外的延遲。

+0

補丁是,就像你提到的,仍然是一個草稿..多PUTs將非常討厭:) 我可以使用POST所有這些,而不是..雖然.. PUT將會更好.. – Evert 2009-06-23 15:54:14

1

我會說這可能是有道理的。我認爲REST的想法非常靈活,所以如果你更新一個實體,爲什麼不只是傳輸需要在實現中更新的字段。確實,它需要更多的服務器端的努力。您必須檢查實體是否可用,並且可以使用傳輸的數據進行更新,並且您需要驗證檢查(與面向模式的面向文檔的數據相反)。

<!-- PUT books/1337 --> 

<book> 
    <title>Hello</title> 
    <author>John Doe</author> 
</book> 

<!-- PUT books/1337 --> 

<book> 
    <title>Hello here I am</title> 
</book> 
+0

REST的想法可能是靈活的,但它確實說你使用的動詞應該有統一的行爲。 HTTP在PUT應該如何處理方面非常具體。共識是PUT應該取代實體,而不是做你的建議。 – 2009-06-23 16:05:50

+0

葉普我同意POST是最好的選擇。儘管它靈活多變,但不應該違反基本思想/規則。 – Daff 2009-06-23 21:26:50

4

您可以簡單地將更新的屬性發布到資源。記住POST是一個全能的動詞,當其他動詞不適合你時,你可以用它來做任何你需要做的事情。

退房羅伊的文章It's ok to use POST

1

我從來不喜歡任何對部分更新的解決方案,無論是。如果我正在設計一個廣泛使用的Web服務,我可能會使用POST。如果它只供相當少數人使用,即我可以與所有我期望稱之爲的人交談,我已經有了兩個不同的想法來解決它。

  1. PUT給一個新的'更新'資源。它基本上會記錄您想要應用的更新,然後負責不重複應用。我設想這個工作有點像一個版本控制系統,它保存一個補丁/變更集列表,每當我試圖想出所有的角落案例時都會變得非常複雜。

  2. PUT添加到資源,但不更改任何不存在的字段。要求輸入NULL的字段必須帶有一個特殊屬性,指示您想要輸出NULL。這似乎更實用,但與PUT應該是完整更新的共識不太吻合。

如果任何人有指向類似想法的討論,請相應地編輯/評論。