【刷題】麪筋-網絡-HTTP中get和post對比

標準答案:

  • 注:(可能不是面試官想聽的)

  • GET參數經過URL傳遞,POST放在Request body中。html

  • 對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。面試

  • GET在瀏覽器回退時是無害的,而POST會再次提交請求。瀏覽器

  • GET產生的URL地址能夠被Bookmark,而POST不能夠。緩存

  • GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。安全

  • GET請求只能進行url編碼,而POST支持多種編碼方式。服務器

  • GET請求在URL中傳送的參數是有長度限制的,而POST麼有。併發

  • GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。tcp

  • GET比POST更不安全,由於參數直接暴露在URL上,因此不能用來傳遞敏感信息。post

詳述

  • 概述:

    • GET和POST是什麼?HTTP協議中的兩種發送請求的方法。
    • HTTP是基於TCP/IP的萬維網通訊協議,因此GET和POST的底層也是TCP/IP連接。
  • 1. Get方法會將提交的數據放在URL中,即以明文的方式傳遞參數數據; Post方法會將提交的數據放在請求體中

    • URL:以?分割URL地址和傳輸數據,參數間以&相連。eg:http://localhost:8080/.../Login.aspx?name=user&pwd=123456
    • 注:以此爲基礎,get和post產生如下區別,分別從存儲和安全性兩個角度考慮。
  • 2. URL和請求體致使的區別:

    • 數據量:Get方法傳遞的數據量較小,受URL長度限制,最大不超過2KB;Post方法傳遞的數據量較大,通常不受限制,大小取決於服務器的處理能力,(大多數服務器最多處理64K大小的url)
    • 可見性:get是明文傳輸,post的傳輸數據不可見;
    • 參數的數據類型限制:GET是ASCII字符,而POST沒有限制。
    • 緩存:GET請求會被瀏覽器主動cache緩存,而POST不會,除非手動設置。
    • 歷史記錄:GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。
    • 收藏書籤:GET產生的URL地址能夠被Bookmark,而POST不能夠
    • 安全性和效率:Get方法安全性低,效率高;Post方法安全性高,效率低(耗時稍長)
    • 後退刷新時:GET在瀏覽器回退時是無害的,而POST數據會被從新提交。
  • 3. tcp數據包:

    • Get方法會產生一個TCP數據包,瀏覽器會把Header和Data一併發送出去,服務器響應200(OK),並回傳相應的數據。
    • Post方法會產生兩個TCP數據包,瀏覽器會先將Header發送出去,服務器響應100(Continue)後,瀏覽器再發送Data,服務器響應200(OK),並回傳相應的數據。
  • 4. 優缺點對比:

    • Get方法安全性低,效率高;Post方法安全性高,效率低(耗時稍長)

打個比方:

TCP就像汽車,咱們用TCP來運輸數據,它很可靠,歷來不會發生丟件少件的現象。可是若是路上跑的全是看起來如出一轍的汽車,那這個世界看起來是一團混亂,送急件的汽車可能被前面滿載貨物的汽車攔堵在路上,整個交通系統必定會癱瘓。編碼

爲了不這種狀況發生,交通規則HTTP誕生了。HTTP給汽車運輸設定了好幾個服務類別,有GET, POST, PUT, DELETE等等。HTTP規定:當執行GET請求的時候,要給汽車貼上GET的標籤(設置method爲GET),並且要求把傳送的數據放在車頂上(URL中)以方便記錄;若是是POST請求,則要在車上貼上POST的標籤,並把貨物放在車箱裏。(固然,你也能夠在GET的時候往車箱內偷偷藏點貨物,可是這是很不光彩;亦可在POST的時候在車頂上也放一些數據,讓人以爲傻乎乎的~)

<HTTP只是個行爲準則,而TCP纔是GET和POST方法實現的基本>

此外,還有另外一個重要的角色:運輸公司。不一樣的瀏覽器(發起http請求)和服務器(接受http請求)就是不一樣的運輸公司。 雖然理論上,你能夠在車頂上無限的堆貨物(即在URL中無限加參數)。可是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,數據量太大對瀏覽器和服務器都是很大負擔。

業界不成文的規定是,(大多數)瀏覽器一般都會限制url長度在2K個字節,而(大多數)服務器最多處理64K大小的url。超過的部分,恕不處理。若是你用GET服務,在request body偷偷藏了數據,不一樣服務器的處理方式也是不一樣的,有些服務器會幫你卸貨,讀出數據,有些服務器則直接忽略。因此,雖然GET能夠帶request body,也並不能保證必定能被接收到哦。

GET只須要汽車跑一趟就把貨送到了,而POST得跑兩趟:第一趟,先去和服務器打個招呼「嗨,我等下要送一批貨來,大家打開門迎接我」,而後再回頭把貨送過去。

參考連接

END

相關文章
相關標籤/搜索