常用的請求方法里面GET請求和POST請求我們都非常熟悉了,今天來談?wù)凱OST,PUT以及PATCH,在了解這些之前我們先理解一個概念 冪等性:
冪等性:
HTTP協(xié)議本身是一種面向資源的應(yīng)用層協(xié)議,但對HTTP協(xié)議的使用實際上存在著兩種不同的方式:
- 一種是RESTful的,它把HTTP當(dāng)成應(yīng)用層協(xié)議,比較忠實地遵守了HTTP協(xié)議的各種規(guī)定;
- 另一種是SOA的,它并沒有完全把HTTP當(dāng)成應(yīng)用層協(xié)議,而是把HTTP協(xié)議作為了傳輸層協(xié)議,然后在HTTP之上建立了自己的應(yīng)用層協(xié)議。
GET方法用于獲取資源,不應(yīng)有副作用,所以是冪等的。比如:GET http://www.bank.com/account/123456,不會改變資源的狀態(tài),不論調(diào)用一次還是N次都沒有副作用。請注意,這里強(qiáng)調(diào)的是一次和N次具有相同的副作用,而不是每次GET的結(jié)果相同。GET http://www.news.com/latest-news這個HTTP請求可能會每次得到不同的結(jié)果,但它本身并沒有產(chǎn)生任何副作用,因而是滿足冪等性的。
DELETE方法用于刪除資源,有副作用,但它應(yīng)該滿足冪等性。比如:DELETE http://www.forum.com/article/4231,調(diào)用一次和N次對系統(tǒng)產(chǎn)生的副作用是相同的,即刪掉id為4231的帖子;因此,調(diào)用者可以多次調(diào)用或刷新頁面而不必?fù)?dān)心引起錯誤。
POST和PUT的區(qū)別容易被簡單地誤認(rèn)為“POST表示創(chuàng)建資源,PUT表示更新資源.但實際上兩者都可以用來創(chuàng)建或是更新數(shù)據(jù).單從技術(shù)上來說,他們并沒有什么區(qū)別.但是在HTTP規(guī)范中POST是非等冪的,多次調(diào)用會產(chǎn)生不同的結(jié)果,比如:創(chuàng)建一個用戶,由于網(wǎng)絡(luò)原因或是其他原因多創(chuàng)建了幾次,那么將會有多個用戶被創(chuàng)建.而PUT id/456則會創(chuàng)建一個id為456的用戶,多次調(diào)用還是會創(chuàng)建的結(jié)果是一樣的,所以PUT是等冪的.
PATCH一般是用來局部更新資源的,假設(shè)我們有一個UserInfo,里面有userId, userName, userGender等10個字段??赡愕木庉嫻δ芤驗樾枨?,在某個特別的頁面里只能修改userName,這時候的更新怎么做?
人們通常(為徒省事)把一個包含了修改后userName的完整userInfo對象傳給后端,做完整更新。但仔細(xì)想想,這種做法感覺有點二,而且真心浪費(fèi)帶寬(純技術(shù)上講,你不關(guān)心帶寬那是你土豪)。
于是PATCH誕生,只傳一個userName到指定資源去,表示該請求是一個局部更新,后端僅更新接收到的字段。
而PUT雖然也是更新資源,但要求前端提供的一定是一個完整的資源對象,理論上說,如果你用了PUT,但卻沒有提供完整的UserInfo,那么缺了的那些字段應(yīng)該被清空.另外PUT會有一個create操作,加入更新的id不存在,會進(jìn)行創(chuàng)建,而PATCH則沒有這個.