學(xué)習(xí)完整課程請移步 互聯(lián)網(wǎng) Java 全棧工程師
HTTP 冪等方法冤留,是指無論調(diào)用多少次都不會有不同結(jié)果的 HTTP 方法酸纲。不管你調(diào)用一次咖楣,還是調(diào)用一百次,一千次处渣,結(jié)果都是相同的伶贰。
GET /tickets # 獲取ticket列表
GET /tickets/12 # 查看某個具體的ticket
POST /tickets # 新建一個ticket
PUT /tickets/12 # 更新ticket 12
PATCH /tickets/12 # 更新ticket 12
DELETE /tickets/12 # 刪除ticekt 12
HTTP GET 方法
HTTP GET 方法,用于獲取資源罐栈,不管調(diào)用多少次接口黍衙,結(jié)果都不會改變,所以是冪等的荠诬。
GET /tickets # 獲取ticket列表
GET /tickets/12 # 查看某個具體的ticket
只是查詢數(shù)據(jù)琅翻,不會影響到資源的變化,因此我們認(rèn)為它冪等柑贞。
值得注意方椎,冪等性指的是作用于結(jié)果而非資源本身。怎么理解呢钧嘶?例如棠众,這個 HTTP GET 方法可能會每次得到不同的返回內(nèi)容,但并不影響資源有决。
可能你會問有這種情況么闸拿?當(dāng)然有咯。例如书幕,我們有一個接口獲取當(dāng)前時間胸墙,我們就應(yīng)該設(shè)計(jì)成
GET /service_time # 獲取服務(wù)器當(dāng)前時間
它本身不會對資源本身產(chǎn)生影響,因此滿足冪等性按咒。
HTTP POST 方法
HTTP POST 方法是一個非冪等方法迟隅,因?yàn)檎{(diào)用多次,都將產(chǎn)生新的資源励七。
POST /tickets # 新建一個ticket
因?yàn)樗鼤Y源本身產(chǎn)生影響智袭,每次調(diào)用都會有新的資源產(chǎn)生,因此不滿足冪等性掠抬。
HTTP PUT 方法
HTTP PUT 方法是不是冪等的呢吼野?我們來看下
PUT /tickets/12 # 更新ticket 12
因?yàn)樗苯影褜?shí)體部分的數(shù)據(jù)替換到服務(wù)器的資源,我們多次調(diào)用它两波,只會產(chǎn)生一次影響瞳步,但是有相同結(jié)果的 HTTP 方法闷哆,所以滿足冪等性。
HTTP PATCH 方法
HTTP PATCH 方法是非冪等的单起。HTTP POST 方法和 HTTP PUT 方法可能比較好理解抱怔,但是 HTTP PATCH 方法只是更新部分資源,怎么是非冪等的呢?
因?yàn)猷值梗琍ATCH 提供的實(shí)體則需要根據(jù)程序或其它協(xié)議的定義屈留,解析后在服務(wù)器上執(zhí)行,以此來修改服務(wù)器上的資源测蘑。換句話說灌危,PATCH 請求是會執(zhí)行某個程序的,如果重復(fù)提交碳胳,程序可能執(zhí)行多次勇蝙,對服務(wù)器上的資源就可能造成額外的影響,這就可以解釋它為什么是非冪等的了挨约。
可能你還不能理解這點(diǎn)味混。我們舉個例子
PATCH /tickets/12 # 更新ticket 12
此時,我們服務(wù)端對方法的處理是烫罩,當(dāng)調(diào)用一次方法,更新部分字段洽故,將這條 ticket 記錄的操作記錄加一贝攒,這次,每次調(diào)用的資源是不是變了呢时甚,所以它是有可能是非冪等的操作隘弊。
HTTP DELETE 方法
HTTP DELETE 方法用于刪除資源,會將資源刪除荒适。
DELETE /tickets/12 # 刪除ticekt 12
調(diào)用一次和多次對資源產(chǎn)生影響是相同的梨熙,所以也滿足冪等性。
如何設(shè)計(jì)符合冪等性的高質(zhì)量 RESTful API
HTTP GET vs HTTP POST
也許刀诬,你會想起一個面試題咽扇。HTTP 請求的 GET 與 POST 方式有什么區(qū)別? 你可能會回答到:GET 方式通過 URL 提交數(shù)據(jù)陕壹,數(shù)據(jù)在 URL 中可以看到质欲;POST 方式,數(shù)據(jù)放置在 HTML HEADER 內(nèi)提交糠馆。但是嘶伟,我們現(xiàn)在從 RESTful 的資源角度來看待問題,HTTP GET 方法是冪等的又碌,所以它適合作為查詢操作九昧,HTTP POST 方法是非冪等的绊袋,所以用來表示新增操作。
但是铸鹰,也有例外癌别,我們有的時候可能需要把查詢方法改造成 HTTP POST 方法。比如掉奄,超長(1k)的 GET URL 使用 POST 方法來替代规个,因?yàn)?GET 受到 URL 長度的限制。雖然姓建,它不符合冪等性诞仓,但是它是一種折中的方案。
HTTP POST vs HTTP PUT
對于 HTTP POST 方法和 HTTP PUT 方法速兔,我們一般的理解是 POST 表示創(chuàng)建資源墅拭,PUT 表示更新資源。當(dāng)然涣狗,這個是正確的理解谍婉。
但是,實(shí)際上镀钓,兩個方法都用于創(chuàng)建資源穗熬,更為本質(zhì)的差別是在冪等性。HTTP POST 方法是非冪等丁溅,所以用來表示創(chuàng)建資源唤蔗,HTTP PUT 方法是冪等的,因此表示更新資源更加貼切窟赏。
HTTP PUT vs HTTP PATCH
此時妓柜,你看會有另外一個問題。HTTP PUT 方法和 HTTP PATCH 方法涯穷,都是用來表述更新資源棍掐,它們之間有什么區(qū)別呢?我們一般的理解是 PUT 表示更新全部資源拷况,PATCH 表示更新部分資源作煌。首先,這個是我們遵守的第一準(zhǔn)則赚瘦。根據(jù)上面的描述最疆,PATCH 方法是非冪等的,因此我們在設(shè)計(jì)我們服務(wù)端的 RESTful API 的時候蚤告,也需要考慮努酸。如果,我們想要明確的告訴調(diào)用者我們的資源是冪等的杜恰,我的設(shè)計(jì)更傾向于使用 HTTP PUT 方法获诈。