<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          知識(shí)點(diǎn)!你知道什么是冪等請(qǐng)求嗎?

          共 3963字,需瀏覽 8分鐘

           ·

          2022-11-06 22:54

          這是「進(jìn)擊的Coder」的第? 744 ?篇技術(shù)分享 作者:崔慶才

          最近在做項(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ì)懵了吧!

          928b4f17c0b1edc7c5e11fd10d8ce84f.webp

          End

          崔慶才的新書《Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)(第二版)》已經(jīng)正式上市了!書中詳細(xì)介紹了零基礎(chǔ)用 Python 開發(fā)爬蟲的各方面知識(shí),同時(shí)相比第一版新增了 JavaScript 逆向、Android 逆向、異步爬蟲、深度學(xué)習(xí)、Kubernetes 相關(guān)內(nèi)容,?同時(shí)本書已經(jīng)獲得 Python 之父 Guido 的推薦,目前本書正在七折促銷中!

          內(nèi)容介紹:《Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)(第二版)》內(nèi)容介紹


          f39f5a736be582dc63d3ff0980b71515.webp


          掃碼購買




          好文和朋友一起看
          瀏覽 69
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美在线日韩 | 国产AV豆花看片 | 久久丫精品 | 欧美黑人XXXXX性受苍井空 | 艹艹艹视频 |