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