最近在做項(xiàng)目的過程中,有一個(gè)需求是在客戶端 HTTP 請(qǐng)求失敗后,增加一個(gè)重試機(jī)制,然后我就翻了一些有關(guān)“重試”的庫,找到一個(gè) axios-retry,在了解的過程中,我就發(fā)現(xiàn)了里面有一個(gè)默認(rèn)的配置選項(xiàng):
“By default, it retries if it is a network error or a 5xx error on an idempotent request (GET, HEAD, OPTIONS, PUT or DELETE).
”
什么意思呢?默認(rèn)情況下,只有當(dāng)出現(xiàn)網(wǎng)絡(luò)問題,是“冪等請(qǐng)求”的 5xx 狀態(tài)碼的情況下,才會(huì)發(fā)起重試,而這里面并不包含 POST 請(qǐng)求。
我就好奇了,這里面的這個(gè) idempotent request,也就是“冪等請(qǐng)求”究竟是什么意思呢?
帶著好奇我就搜索了下,學(xué)到了新的知識(shí),這里就跟大家分享下。
冪等請(qǐng)求
冪等請(qǐng)求,英文叫做 Idempotent Request,官方的文檔是這個(gè):https://developer.mozilla.org/en-US/docs/Glossary/Idempotent
官方定義如下:
“An HTTP method is idempotent if the intended effect on the server of making a single request is the same as the effect of making several identical requests.
”
意思就是,如果發(fā)出單個(gè)請(qǐng)求對(duì)服務(wù)器的預(yù)期效果與發(fā)出多個(gè)相同請(qǐng)求的效果相同,則HTTP 方法是冪等的。
其實(shí)說白了意思就是這個(gè)請(qǐng)求發(fā)起一次和發(fā)起多次,都對(duì)服務(wù)器結(jié)果沒什么區(qū)別,一次請(qǐng)求后,服務(wù)器結(jié)果由 A 變成了 B,后面再發(fā)多次這樣的請(qǐng)求,結(jié)果還是 B 不變,那這個(gè)請(qǐng)求就是冪等的。
冪等請(qǐng)求分類
我們知道,HTTP 請(qǐng)求一共有 GET、POST、PATCH、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT這些,那哪些是冪等,哪些是不冪等的呢。
安全請(qǐng)求
這里面我們先分析下,其中有的請(qǐng)求就是一些壓根不會(huì)對(duì)服務(wù)器產(chǎn)生任何影響的請(qǐng)求,比如說 GET 就是從服務(wù)器上讀取信息并返回,服務(wù)器的數(shù)據(jù)根本不會(huì)被修改,這種請(qǐng)求就是“安全”的請(qǐng)求。
安全請(qǐng)求有哪些呢?GET、HEAD、OPTIONS、TRACE。
具體對(duì)如上三種請(qǐng)求的解釋見官方文檔:
- GET:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET
- HEAD:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD
- OPTIONS:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS
- TRACE:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/TRACE
所以,GET、HEAD、OPTIONS、TRACE 這些請(qǐng)求都是冪等請(qǐng)求。
POST
接下來我們來分析下 POST 請(qǐng)求,這個(gè)是冪等的嗎?
不是。
因?yàn)?POST 請(qǐng)求一般會(huì)用作創(chuàng)建一個(gè)字段,比如:
POST /add_row HTTP/1.1
POST /add_row HTTP/1.1 - > Adds a 2nd row
POST /add_row HTTP/1.1 - > Adds a 3rd row
每 POST 一次,一個(gè)字段就會(huì)被創(chuàng)建,所以請(qǐng)求一次的結(jié)果和請(qǐng)求多次的結(jié)果是不一樣的。
所以,POST 不是冪等請(qǐng)求。
PUT
那 PUT 是不是呢?
是。
因?yàn)?PUT 請(qǐng)求一般會(huì)用作修改一個(gè)資源,而且是全部覆蓋修改。
所以,發(fā)起一次 PUT 請(qǐng)求,服務(wù)器資源就被修改為 PUT 請(qǐng)求的內(nèi)容了,如果再繼續(xù)發(fā)起多次,那最終結(jié)果還是不變。
所以 PUT 請(qǐng)求是冪等請(qǐng)求。
DELETE
同理,DELETE 是不是呢?
是。
因?yàn)?DELETE 請(qǐng)求是用作刪除服務(wù)器資源的,發(fā)起一次 DELETE 請(qǐng)求,資源就被刪除了,在發(fā)起多次,結(jié)果也是一樣的,因?yàn)橘Y源已經(jīng)被刪除了。
所以 DELETE 請(qǐng)求是冪等請(qǐng)求。
PATCH
既然 PUT 是冪等請(qǐng)求,那么 PATCH 是不是呢?
不是。
PATCH 這個(gè)請(qǐng)求可能大家見的不多啊,這個(gè)請(qǐng)求其實(shí)和 PUT 類似,也是用來修改資源的,但 PUT 偏向于把整個(gè)資源進(jìn)行修改,而 PATCH 是修改資源的某一部分。
具體 PATCH 的介紹大家可以見:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH
原文有一個(gè)對(duì) PATCH 是是否冪等的解釋:
“A PATCH is not necessarily idempotent, although it can be. Contrast this with PUT; which is always idempotent. The word "idempotent" means that any number of repeated, identical requests will leave the resource in the same state. For example if an auto-incrementing counter field is an integral part of the resource, then a PUT will naturally overwrite it (since it overwrites everything), but not necessarily so for PATCH.
”
所以,在某些情況下,PATCH 不一定是冪等的,比如服務(wù)器的某些資源的某個(gè)字段是一個(gè)自增技術(shù),那么每 PATCH 一次,這個(gè)就會(huì)改變一次,而 PUT 往往都是全部覆蓋。
所以,在這里,PATCH 不被認(rèn)為是冪等請(qǐng)求。
CONNECT
這個(gè) CONNECT 大家可能也用的不多啊,CONNECT 請(qǐng)求會(huì)被用作啟動(dòng)與所請(qǐng)求資源的雙向通信,它可以用來打開隧道。
具體大家可以參見:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/CONNECT
所以,這個(gè)本身就是一種用來啟動(dòng)雙向通信的請(qǐng)求,是一種逐跳請(qǐng)求,請(qǐng)求一次和多次所建立的一些連接次數(shù)也是不一樣的,所以不是冪等請(qǐng)求。
總結(jié)
好了,這里就總結(jié)了冪等和非冪等請(qǐng)求的一些定義和分析。
冪等請(qǐng)求有:GET, HEAD, PUT, DELETE, OPTIONS, TRACE
非冪等請(qǐng)求有:POST, PATCH, CONNECT
看完這篇文章,以后大家再問起冪等請(qǐng)求相關(guān)的問題,肯定就不會(huì)懵了吧!
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7104瀏覽量
89295 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9256瀏覽量
85762 -
HTTP
+關(guān)注
關(guān)注
0文章
510瀏覽量
31358 -
客戶端
+關(guān)注
關(guān)注
1文章
290瀏覽量
16726
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論