RESTful, 說說 http 的 patch method


最早的時候,我們只需要 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 的區別。

再來看下目前誰實現了 PATCH 方法,誰還沒有實現 PATCH 方法

1. Apache HttpComponents HttpClient version 4.2 or later 支持了 PATCH
2. 目前 JDK7 的 HttpURLConnection 未實現 PATCH
3. TOMCAT 7 也不行
4. PlayFramework 2 也不支持
5. Spring 3.2 開始支持 PATCH 方法,但要選對部署的容器
6. JBoss Netty 支持 PATCH,可見: http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/codec/http/class-use/HttpMethod.html

總之現在實現了 PATCH 方法的容器真是少。

參考:1. List of HTTP methods (verbs)
             2. Method Definitions
             3. RFC 5789 - PATCH Method for HTTP
             4. RFC 2616
             5. Standard Methods- RESTful API Design


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM