最近在做項(xiàng)目的過程中,有一個需求是在客戶端 HTTP 請求失敗后,增加一個重試機(jī)制,然后我就翻了一些有關(guān)“重試”的庫,找到一個 axios-retry,在了解的過程中,我就發(fā)現(xiàn)了里面有一個默認(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ò)問題,是“冪等請求”的 5xx 狀態(tài)碼的情況下,才會發(fā)起重試,而這里面并不包含 POST 請求。
我就好奇了,這里面的這個 idempotent request,也就是“冪等請求”究竟是什么意思呢?
帶著好奇我就搜索了下,學(xué)到了新的知識,這里就跟大家分享下。
冪等請求
冪等請求,英文叫做 Idempotent Request,官方的文檔是這個: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ā)出單個請求對服務(wù)器的預(yù)期效果與發(fā)出多個相同請求的效果相同,則HTTP 方法是冪等的。
其實(shí)說白了意思就是這個請求發(fā)起一次和發(fā)起多次,都對服務(wù)器結(jié)果沒什么區(qū)別,一次請求后,服務(wù)器結(jié)果由 A 變成了 B,后面再發(fā)多次這樣的請求,結(jié)果還是 B 不變,那這個請求就是冪等的。
冪等請求分類
我們知道,HTTP 請求一共有 GET、POST、PATCH、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT這些,那哪些是冪等,哪些是不冪等的呢。
安全請求
這里面我們先分析下,其中有的請求就是一些壓根不會對服務(wù)器產(chǎn)生任何影響的請求,比如說 GET 就是從服務(wù)器上讀取信息并返回,服務(wù)器的數(shù)據(jù)根本不會被修改,這種請求就是“安全”的請求。
安全請求有哪些呢?GET、HEAD、OPTIONS、TRACE。
具體對如上三種請求的解釋見官方文檔:
- 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 這些請求都是冪等請求。
POST
接下來我們來分析下 POST 請求,這個是冪等的嗎?
不是。
因?yàn)?POST 請求一般會用作創(chuàng)建一個字段,比如:
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 一次,一個字段就會被創(chuàng)建,所以請求一次的結(jié)果和請求多次的結(jié)果是不一樣的。
所以,POST 不是冪等請求。
PUT
那 PUT 是不是呢?
是。
因?yàn)?PUT 請求一般會用作修改一個資源,而且是全部覆蓋修改。
所以,發(fā)起一次 PUT 請求,服務(wù)器資源就被修改為 PUT 請求的內(nèi)容了,如果再繼續(xù)發(fā)起多次,那最終結(jié)果還是不變。
所以 PUT 請求是冪等請求。
DELETE
同理,DELETE 是不是呢?
是。
因?yàn)?DELETE 請求是用作刪除服務(wù)器資源的,發(fā)起一次 DELETE 請求,資源就被刪除了,在發(fā)起多次,結(jié)果也是一樣的,因?yàn)橘Y源已經(jīng)被刪除了。
所以 DELETE 請求是冪等請求。
PATCH
既然 PUT 是冪等請求,那么 PATCH 是不是呢?
不是。
PATCH 這個請求可能大家見的不多啊,這個請求其實(shí)和 PUT 類似,也是用來修改資源的,但 PUT 偏向于把整個資源進(jìn)行修改,而 PATCH 是修改資源的某一部分。
具體 PATCH 的介紹大家可以見:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH
原文有一個對 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ù)器的某些資源的某個字段是一個自增技術(shù),那么每 PATCH 一次,這個就會改變一次,而 PUT 往往都是全部覆蓋。
所以,在這里,PATCH 不被認(rèn)為是冪等請求。
CONNECT
這個 CONNECT 大家可能也用的不多啊,CONNECT 請求會被用作啟動與所請求資源的雙向通信,它可以用來打開隧道。
具體大家可以參見:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/CONNECT
所以,這個本身就是一種用來啟動雙向通信的請求,是一種逐跳請求,請求一次和多次所建立的一些連接次數(shù)也是不一樣的,所以不是冪等請求。
總結(jié)
好了,這里就總結(jié)了冪等和非冪等請求的一些定義和分析。
冪等請求有:GET, HEAD, PUT, DELETE, OPTIONS, TRACE
非冪等請求有:POST, PATCH, CONNECT
看完這篇文章,以后大家再問起冪等請求相關(guān)的問題,肯定就不會懵了吧!
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6754瀏覽量
88613 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
8843瀏覽量
84946 -
HTTP
+關(guān)注
關(guān)注
0文章
495瀏覽量
30892 -
客戶端
+關(guān)注
關(guān)注
1文章
287瀏覽量
16625
發(fā)布評論請先 登錄
相關(guān)推薦
評論