什么是冪等性

學(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 方法获诈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仍源,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舔涎,更是在濱河造成了極大的恐慌笼踩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亡嫌,死亡現(xiàn)場離奇詭異嚎于,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挟冠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門于购,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人知染,你說我怎么就攤上這事肋僧。” “怎么了控淡?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵嫌吠,是天一觀的道長。 經(jīng)常有香客問我掺炭,道長辫诅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任涧狮,我火速辦了婚禮炕矮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勋篓。我一直安慰自己吧享,他們只是感情好魏割,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布譬嚣。 她就那樣靜靜地躺著,像睡著了一般钞它。 火紅的嫁衣襯著肌膚如雪拜银。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天遭垛,我揣著相機(jī)與錄音尼桶,去河邊找鬼。 笑死锯仪,一個胖子當(dāng)著我的面吹牛泵督,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庶喜,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼小腊,長吁一口氣:“原來是場噩夢啊……” “哼救鲤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秩冈,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤本缠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后入问,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丹锹,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年芬失,在試婚紗的時候發(fā)現(xiàn)自己被綠了楣黍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡麸折,死狀恐怖锡凝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垢啼,我是刑警寧澤窜锯,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站芭析,受9級特大地震影響借笙,放射性物質(zhì)發(fā)生泄漏簿废。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摇肌。 院中可真熱鬧,春花似錦呕乎、人聲如沸荚斯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽对碌。三九已至,卻和暖如春蒿偎,著一層夾襖步出監(jiān)牢的瞬間朽们,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工骑脱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苍糠。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拥娄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容