0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

冪等和非冪等請(qǐng)求的一些定義和分析

科技綠洲 ? 來(lái)源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-10-17 10:50 ? 次閱讀

最近在做項(xiàng)目的過(guò)程中,有一個(gè)需求是在客戶(hù)端 HTTP 請(qǐng)求失敗后,增加一個(gè)重試機(jī)制,然后我就翻了一些有關(guān)“重試”的庫(kù),找到一個(gè) axios-retry,在了解的過(guò)程中,我就發(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ò)問(wèn)題,是“冪等請(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í)說(shuō)白了意思就是這個(gè)請(qǐng)求發(fā)起一次和發(fā)起多次,都對(duì)服務(wù)器結(jié)果沒(méi)什么區(qū)別,一次請(qǐng)求后,服務(wù)器結(jié)果由 A 變成了 B,后面再發(fā)多次這樣的請(qǐng)求,結(jié)果還是 B 不變,那這個(gè)請(qǐng)求就是冪等的。

冪等請(qǐng)求分類(lèi)

我們知道,HTTP 請(qǐng)求一共有 GET、POST、PATCH、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT這些,那哪些是冪等,哪些是不冪等的呢。

安全請(qǐng)求

這里面我們先分析下,其中有的請(qǐng)求就是一些壓根不會(huì)對(duì)服務(wù)器產(chǎn)生任何影響的請(qǐng)求,比如說(shuō) GET 就是從服務(wù)器上讀取信息并返回,服務(wù)器的數(shù)據(jù)根本不會(huì)被修改,這種請(qǐng)求就是“安全”的請(qǐng)求。

安全請(qǐng)求有哪些呢?GET、HEAD、OPTIONS、TRACE。

具體對(duì)如上三種請(qǐng)求的解釋見(jiàn)官方文檔:

  • 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

接下來(lái)我們來(lái)分析下 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)求可能大家見(jiàn)的不多啊,這個(gè)請(qǐng)求其實(shí)和 PUT 類(lèi)似,也是用來(lái)修改資源的,但 PUT 偏向于把整個(gè)資源進(jìn)行修改,而 PATCH 是修改資源的某一部分。

具體 PATCH 的介紹大家可以見(jiàn):https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH

原文有一個(gè)對(duì) PATCH 是是否冪等的解釋?zhuān)?/p>

“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)求資源的雙向通信,它可以用來(lái)打開(kāi)隧道。

具體大家可以參見(jiàn):https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/CONNECT

所以,這個(gè)本身就是一種用來(lái)啟動(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

看完這篇文章,以后大家再問(wèn)起冪等請(qǐng)求相關(guān)的問(wèn)題,肯定就不會(huì)懵了吧!

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6715

    瀏覽量

    88308
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8701

    瀏覽量

    84543
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    478

    瀏覽量

    30759
  • 客戶(hù)端
    +關(guān)注

    關(guān)注

    1

    文章

    287

    瀏覽量

    16604
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    穩(wěn)態(tài)熱暈暈效應(yīng)的數(shù)值分析

    【作者】:孫運(yùn)強(qiáng);許曉軍;習(xí)鋒杰;陸啟生;吳武明;郭少鋒;【來(lái)源】:《強(qiáng)激光與粒子束》2010年02期【摘要】:運(yùn)用高斯光束展開(kāi)的方法,分析圓對(duì)稱(chēng)平頂光束在大氣傳輸中的熱暈及其暈效應(yīng)。通過(guò)對(duì)熱暈
    發(fā)表于 04-22 11:37

    離線計(jì)算中的和DataWorks中的相關(guān)事項(xiàng)

    多次的結(jié)果和執(zhí)行次是完全樣的。嚴(yán)格的定義這里不展開(kāi)討論,有興趣的可以到網(wǎng)上搜下,會(huì)有很多介紹。通俗一些說(shuō),
    發(fā)表于 02-27 13:24

    請(qǐng)問(wèn)DSP28335函數(shù)pow()運(yùn)算的速度如何?

    大家好! 本人是DSP28335的菜鳥(niǎo),最近在做計(jì)算時(shí)需要用到pow()運(yùn)算,大約能用到4到5次運(yùn)算,pow()是double雙精度運(yùn)算,不知道這個(gè)函數(shù)的速度如何,很多資料說(shuō)雙精度運(yùn)算很慢,不知
    發(fā)表于 09-05 11:08

    OPPO R9S楊版哄搶空 后續(xù)還有紅色“驚喜版”

    本月20日,OPPO R9s楊定制版“小Phone”正式推出,23日上午10:00,OPPO R9s楊定制版——小phone在OPPO官網(wǎng)正式開(kāi)售,開(kāi)售后32秒就被拍完,47分
    發(fā)表于 12-26 17:29 ?5007次閱讀

    個(gè)安全可驗(yàn)證的方陣云計(jì)算外包協(xié)議

    為解決計(jì)算能力有限的對(duì)象(用戶(hù))所面臨的大維數(shù)方陣的高次計(jì)算問(wèn)題,利用云計(jì)算平臺(tái)(云端),提出個(gè)安全可驗(yàn)證的方陣云計(jì)算外包協(xié)議。協(xié)議中,用戶(hù)首先構(gòu)造個(gè)隨機(jī)置換,再結(jié)合克羅內(nèi)克函
    發(fā)表于 01-17 13:50 ?0次下載
    <b class='flag-5'>一</b>個(gè)安全可驗(yàn)證的方陣<b class='flag-5'>冪</b>云計(jì)算外包協(xié)議

    在高并發(fā)下怎么保證接口的性?

    前言 接口性問(wèn)題,對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),是個(gè)跟語(yǔ)言無(wú)關(guān)的公共問(wèn)題。本文分享了一些解決這類(lèi)問(wèn)題非常實(shí)用的辦法,絕大部分內(nèi)容我在項(xiàng)目中實(shí)踐過(guò)的,給有需要的小伙伴
    的頭像 發(fā)表于 05-14 10:23 ?1711次閱讀
    在高并發(fā)下怎么保證接口的<b class='flag-5'>冪</b><b class='flag-5'>等</b>性?

    get與post的請(qǐng)求一些區(qū)別

    今天再次看到這個(gè)問(wèn)題,我也有了一些新的理解和感觸,臨時(shí)回顧了下 get 與 post 的請(qǐng)求一些區(qū)別。
    的頭像 發(fā)表于 09-07 10:00 ?1290次閱讀

    分析解決(性)的方法

    這個(gè)概念,是個(gè)數(shù)學(xué)上的概念,即:f……(f(f(x))) = f(x)。用在計(jì)算機(jī)領(lǐng)域,指的是系統(tǒng)里的接口或方法對(duì)外的種承諾,使用相同參數(shù)對(duì)同
    的頭像 發(fā)表于 10-14 10:08 ?855次閱讀

    Spring Boot實(shí)現(xiàn)接口性的4種方案

    個(gè)數(shù)學(xué)與計(jì)算機(jī)學(xué)概念,在數(shù)學(xué)中某元運(yùn)算為時(shí),其作用在任
    的頭像 發(fā)表于 11-08 10:21 ?910次閱讀

    什么是性?的實(shí)現(xiàn)原理

    在編程中個(gè)操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與次執(zhí)行的影響相同。函數(shù),或
    發(fā)表于 01-05 10:40 ?5695次閱讀

    DS5250微控制器的模時(shí)序

    用于許多加密算法。任何實(shí)現(xiàn)這些算法之的人都必須知道操作大約需要多長(zhǎng)時(shí)間。本應(yīng)用筆記描述了如何在DS5250高速、安全微控制器上完成模運(yùn)算。它列出了運(yùn)行各種表達(dá)式的典型時(shí)間,并描述了獲取計(jì)時(shí)的代碼流。
    的頭像 發(fā)表于 01-11 16:02 ?593次閱讀
    DS5250微控制器的模<b class='flag-5'>冪</b>時(shí)序

    個(gè)注解,優(yōu)雅的實(shí)現(xiàn)接口性!

    除了查詢(xún)和刪除之外,還有更新操作,同樣的更新操作在大多數(shù)場(chǎng)景下也是天然的,其例外是也會(huì)存在ABA的問(wèn)題,更重要的是,比如執(zhí)行update table set a = a + 1 where v = 1這樣的更新就
    的頭像 發(fā)表于 08-26 14:36 ?743次閱讀
    <b class='flag-5'>一</b>個(gè)注解,優(yōu)雅的實(shí)現(xiàn)接口<b class='flag-5'>冪</b><b class='flag-5'>等</b>性!

    基于接口性解決方案

    接口性是指無(wú)論調(diào)用接口的次數(shù)是次還是多次,對(duì)于同資源的操作都只會(huì)產(chǎn)生次結(jié)果。換句話(huà)說(shuō),多次重復(fù)調(diào)用相同的接口
    的頭像 發(fā)表于 09-30 16:27 ?364次閱讀
    基于接口<b class='flag-5'>冪</b><b class='flag-5'>等</b>性解決方案

    為什么要實(shí)現(xiàn)性校驗(yàn) 如何實(shí)現(xiàn)接口的性校驗(yàn)

    前端重復(fù)提交表單:在填寫(xiě)一些表格時(shí)候,用戶(hù)填寫(xiě)完成提交,很多時(shí)候會(huì)因網(wǎng)絡(luò)波動(dòng)沒(méi)有及時(shí)對(duì)用戶(hù)做出提交成功響應(yīng),致使用戶(hù)認(rèn)為沒(méi)有成功提交,然后直點(diǎn)提交按鈕,這時(shí)就會(huì)發(fā)生重復(fù)提交表單請(qǐng)求。
    的頭像 發(fā)表于 02-20 14:14 ?1020次閱讀

    探索LabVIEW編程接口性原理與實(shí)踐

    性原來(lái)是數(shù)學(xué)上的概念,在編程領(lǐng)域可以理解為:多次請(qǐng)求個(gè)資源或執(zhí)行某個(gè)操作時(shí)應(yīng)該具有唯
    的頭像 發(fā)表于 02-29 10:24 ?478次閱讀
    探索LabVIEW編程接口<b class='flag-5'>冪</b><b class='flag-5'>等</b>性原理與實(shí)踐