国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        GET和POST報文上的區別

        2022-08-11 11:31
        程序媛驛站
        關注

        前   言

        最近看了一些同學的面經,發現無論什么技術崗位,還是會問到 GET 和 POST 請求的區別,而搜索出來的答案并不能讓我們裝得一手好逼,那就讓我們從 HTTP 報文的角度來擼一波,從而搞明白他們的區別。

        標準答案

        在開始之前,先看一下標準答案【來自w3school】長什么樣子來保個底。標準答案很美好,但是在面試的時候把下面的表格甩面試官一臉,問題應該也不大。

        注意,并不是說標準答案有誤,上述區別在大部分瀏覽器上是存在的,因為這些瀏覽器實現了 HTTP 標準。

        所以從標準上來看,GET 和 POST 的區別基本上可以總結如下:

        GET 用于獲取信息,無副作用,冪等,且可緩存

        POST 用于修改服務器上的數據,有副作用,非冪等,不可緩存

        但是,既然本文從報文角度來說,那就先不討論 RFC 上的區別,單純從數據角度談談。

        GET和POST報文上的區別

        先下結論:GET 和 POST 方法沒有本質區別,僅報文格式不同。

        GET 和 POST 只是 HTTP 協議中兩種請求方式,而 HTTP 協議是基于 TCP/IP 的應用層協議,無論 GET 還是 POST,用的都是同一個傳輸層協議,所以在傳輸上,沒有區別。

        報文格式上,不帶參數時,最大區別僅僅是第一行方法名不同,一個是GET,一個是POST

        帶參數時報文的區別呢?在約定中,GET 方法的參數應該放在 url 中,POST 方法參數應該放在 body 中

        舉個例子,如果參數是 name=qiming.c, age=22。

        GET 方法簡約版報文可能是這樣的

        image.png

        Host: localhost

        POST 方法簡約版報文可能是這樣的

        image.png

        兩種方法本質上是 TCP 連接,沒有差別,也就是說,如果我不按規范來也是可以的。我們可以在 URL 上寫參數,然后方法使用 POST;也可以在 Body 寫參數,然后方法使用 GET。當然,這需要服務端支持。

        常見的疑惑問題

        一、GET 方法參數寫法是固定的嗎?

        在約定中,一般我們的參數是寫在 ? 后面,用 & 分割。

        我們知道,解析報文的過程是通過獲取 TCP 數據,用正則等工具從數據中獲取 Header 和 Body,從而提取參數。

        也就是說,我們可以自己約定參數的寫法,只要服務端能夠解釋出來就行,一種比較流行的寫法是這樣 :

        image.png

        二、POST 方法比 GET 方法安全?

        按照網上大部分文章的解釋,POST 比 GET 安全,因為數據在地址欄上不可見。

        然而從傳輸的角度來說,他們都是不安全的,因為 HTTP 在網絡上是明文傳輸,只要在網絡節點上抓包,就能完整地獲取數據報文。

        要想安全傳輸,就只有加密,也就是 HTTPS。

        三、聽說 GET 方法參數長度有限制?

        在網上看到很多關于兩者區別的文章都有這一條,提到瀏覽器地址欄輸入的參數是有限的。

        首先說明一點,其實HTTP 協議本身倒并沒有 Body 和 URL 的長度限制,對 URL 限制的大多是瀏覽器服務器端自己限制的。

        瀏覽器原因就不說了,服務器是因為處理長 URL 要消耗比較多的資源,為了性能和安全(防止惡意構造長 URL 來攻擊)考慮,會給 URL 長度加限制。

        四、POST 方法會產生兩個TCP數據包?

        有些文章中提到,POST 請求會將 Header 和 Body 分開發送,先發送 Header,服務端返回 100 狀態碼再發送 Body。

        HTTP 協議中也并沒有明確說明 POST 會產生兩個 TCP 數據包,而且實際測試(Chrome)發現,Header 和 Body 不會分開發送。

        所以,Header 和 Body 分開發送是部分瀏覽器或框架的請求方法,不屬于 Post的必然行為。

        代碼驗證時間

        如果對 GET 和 POST 請求的報文區別有疑惑,可以直接用Python起一個 Socket 服務端,然后封裝簡單的 HTTP 處理方法,直接觀察和處理 HTTP 報文,就能一目了然。多實驗還是有好處的。

        image.png

        image.png

        上面代碼就是用Python寫的簡單的打印請求報文然后返回 Hello World 的 html 頁面,接著運行起來:

        image.png

        然后從瀏覽器中來請求看看

        打印出來的報文

        然后就可以手動驗證上面的一些說法,比如說要測試 Header 和 Body 是否分開傳輸,由于代碼沒有返回 100 狀態碼,如果我們 POST 請求成功就說明是一起傳輸的 (Chrome/postman)。

        又比如 w3school 里面說 URL 的最大長度是 2048 個字符,那我們在代碼里面加上一句計算uri 長度的代碼即可

        image.png

        我們用 Postman 直接發送 >2048 個字符(比如這里發送2800個字符)的請求看看:

        很明顯可以看到發2800個字符也都是沒問題的

        然后我們可以得出結論,url 長度限制僅僅是某些瀏覽器服務器的限制,和 HTTP 協議本身并沒有關系。

        所以有什么想法用Python寫個小腳本驗證一下就徹底明白了!

               原文標題 : 面試必考 | GET和POST區別

        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          人工智能 獵頭職位 更多
          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 亚洲区视频| 国产九九在线视频| 一区二区三区视频| 论坛| 91在线亚洲| a网站免费观看| 香蕉97人妻免费碰碰碰| 99精品视频在线观看| 国产在线拍揄自揄拍无码男男| 太湖县| 国产拳交视频| 国产精品色哟哟| 亚洲成人经典| A片入口| 临桂县| 无码国模在线观看| 成人自拍中文字幕| 在线播放日韩一区| 亚洲日韩AV无码专区影院| 濮阳县| 激情婷婷五月天| 黄色V国产| 女性| 亚洲五月婷婷| 日韩精品久久| 达州市| 亚洲自拍另类| 日韩精品久久| 蜜桃视频在线入口www| 久久发布国产伦子伦精品| 国产丝袜打飞机免费在线| 龙泉市| 精品久久国产| 中文字幕少妇人妻| 9l精品国产一区二区| 1024国产视频| 美女成人网站| 亚洲熟妇无码成人A片| 松江区| 亚洲精品影院| 91成人视频在线观看|