1. 程式人生 > >HTTP的PATCH與PUT對比

HTTP的PATCH與PUT對比

最早的時候,我們只需要 GET 和 POST 方法,POST 方法的引入也只是為了消除 URL 過長,引數隱藏,上傳檔案的問題,完全和語義無關。接觸到 RESTful 之後,我們開始思考 GET 和 POST 的不同語義,並且十分必要的去發掘出所有的 HTTP method,HTTP/1.1 所實現的 method,見 RFC 2616, 有這些:

OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT

規範是這麼定義的,這還要看容器實現了多少,比如 Tomcat 7 中的 servlet api 實現了

doOptions, doGet, doHead, doPost, doPut, doDelete, doTrace 就差個 doConnect 了。

而我們這裡要說的 PATCH method 是在 Servlet 3.0 和當前 Tomcat 7 中都提到的,也就是尚未實現它。

這也難怪,PATCH 在 2010 年三月份才成為正式的方法,見 RFC 5789。沒有 PATCH 的時候我們進行更新的操作採用的是 PUT 方法。那麼 PATCH 和 PUT 有什麼區別呢?

同樣可以從語義上去理解,有兩方面的對比:

1. 對已有資源的操作:

PATCH 用於資源的部分內容的更新,例如更新某一個欄位。具體比如說只更新使用者資訊的電話號碼欄位

而 PUT 用於更新某個資源較完整的內容,比如說使用者要重填完整表單更新所有資訊,後臺處理更新時可能只是保留內部記錄 ID 不變。

2. 當資源不存在時:

聯想到版本控制 PATCH 是修改原來的內容,也可能會產生一個新的版本。比如當資源不存在的時候,PATCH 可能會去建立一個新的資源,這個意義上像是 saveOrUpdate 操作。

PUT 只對已有資源進行更新操作,所以是 update 操作

見 When should we use the PATCH HTTP method? in The RESTful CookBook

The HTTP methods PATCH can be used to update partial resources. 
For instance, when you only need to update one field of the resource, 
PUTting a complete resource representation might be cumbersome and utilizes more bandwidth


PATCH /user/jthijssen HTTP/1.1
<user>
    <firstname>Joshua</firstname>
</user>


Also, the PUT method is idempotent. 
PUTting the same data multiple times to the same resource, should not result in different resources, 
while POSTing to the same resource can result creation of multiple resources.

- See more at: http://restcookbook.com/HTTP%20Methods/patch/#sthash.gYGM7j3Q.dpuf

在 RFC 5789 更詳述了 PATCH 與 PUT 的區別。

原文地址