GET和POST兩者的區別


GET 和 POST 是 HTTP 協議中的兩種發送請求的基本方法,對於前端開發者而言,幾乎每天都在使用它們,再熟悉不過了,一般也都能說出幾點兩者的區別。

如果面試中被問到這個問題,先回答一下幾點,肯定是不會有錯的:

  1. GET 參數通過 URL傳值,參數可見且不夠安全,不能用來傳遞敏感信息,而 POST 參數放在 Request body 中,參數不可見,相對而言比較安全;
  2. GET 請求在 URL 中傳送的數據大小是有限制的(一般不超過2k-4k,取決於瀏覽器),而 POST 請求中的數據大小長度根據后台配置文件設定,理論上沒有限制;
  3. GET 在瀏覽器回退時是無害的,而 POST 在瀏覽器回退時會再次提交請求;(GET 會將請求參數放在請求的 URL 中,回退操作實際上瀏覽器會從之前的緩存中拿結果,POST 每次調用都會創建新的資源)
  4. GET 請求會被瀏覽器主動 cache,而 POST 除非手動設置,否則不會;(瀏覽器緩存分為強緩存和協商緩存)
  5. GET 產生的 URL 地址可以被 Bookmark,而 POST 不可以;(GET 請求會把參數帶到 URL 中,可以此保存瀏覽器書簽)
  6. GET 請求參數會被完整地保留在瀏覽器歷史記錄里,而 POST 中的參數不會被保留;(道理同上)
  7. GET 請求只能進行 URL 編碼,而 POST 支持多種編碼方式;
  8. 對參數的數據類型,GET 只接受 ASCII 字符,而 POST 沒有限制;(URL 是 HTTP 的一個首部,根據約定,一定是 ASCII 字符的)
  9. GET 請求產生一個 TCP 數據包,而 POST 請求產生兩個數據包;

但是!

這就結束了嗎?

NO!NO!NO!

想要拿到高薪,得說出一點別人不知道的東西,氣場這塊要拿捏地死死的。

拋開固有印象,我們重新來審視一下 GET 和 POST,會發現它們本質上沒有區別!

我們知道 GET 和 POST 是 HTTP 協議中的兩種發送請求的方法,而 HTTP 是基於 TCP/IP 的關於數據在萬維網中如何通信的協議

HTTP 的底層是 TCP/IP,所以 GET 和 POST 的底層也是 TCP/IP。也就是說, GET 和 POST 都是 TCP 連接(這應該可以算是兩者的相同點)。

換句話說,GET 和 POST 能做的事情是一樣的,在技術上完全可以給 GET 請求 加上 Request body,給 POST 請求帶上 URL 參數。

但是存在也不代表着一定合理。

在萬維網世界中,TCP就像汽車,負責用來運輸數據,但路上的汽車不會只有一輛的,而為了維護交通的高效運行,交通規則 HTTP 應運而生。HTTP 給汽車設定了幾種服務類別,有 GET、POST、PUT、DELETE 等。HTTP 規定,當執行 GET 請求時,要給該車貼上 GET 標簽,並且把要傳輸的數據放在車頂上(url 中)以方便記錄;當執行 POST 請求時,要給該車貼上 POST 標簽,並且為了安全把要傳輸的數據放在車廂里(Request body 中)。

當然規定是規定,你要非要在 GET 的時候偷偷在車廂里放一點貨,或者在 POST 的時候把貨往車頂上放,誰也攔不住你,只是會讓別人覺得你是個憨憨,不跟你玩。

所以,HTTP 只是個行為准則,而 TCP 才是 GET 和 POST 怎么實現的基本。

上面我們了解了 HTTP 對 GET 和 POST 參數的傳輸渠道(url 還是 Request body)提出了要求,但我們還知道,兩種請求的還對參數大小做出了限制,這又是怎么回事呢?

在萬維網世界中,還有另一個重要角色:運輸公司。不同的瀏覽器(發起 HTTP 請求)和服務器(接收 HTTP 請求)就是不同的運輸公司。雖然理論上,可以在車頂無限堆放貨物(url 中無限加參數),但是裝貨和卸貨也是要成本的,運輸公司要核算成本和控制風險,所以他們會限制單次運輸量,數據量太大對瀏覽器和服務器都是很大的負擔。

所以,大多數瀏覽器會限制 url 長度最多在 2k 個字節,大多數服務器最多處理 64k 大小的 url。如果你用 GET 服務,在 Request body 中偷偷藏了數據,不同服務器的處理方式也是不同的,有些服務器會幫你讀出數據,但有些服務器會直接忽略。所以還是不要這樣操作了。

現在我們知道,GET 和 POST 本質上就是 TCP 連接,並無差別,只不過由於 HTTP 的規定和瀏覽器/服務器的限制,導致他們在應用過程中體現出一些不同。

說道這里,GET 和 POST 要說的也就差不多了。等等,或許你注意到了,上文中我特意給第9點加粗了,也就是:GET 請求產生一個 TCP 數據包,而 POST 請求產生兩個數據包。

這是怎么回事呢?

對於 GET 請求,瀏覽器會把 http header 和 data 一並發送出去,服務器響應 200;

而對 POST 請求,瀏覽器先發送 header,服務器響應 100,瀏覽器再發送 data,服務器響應 200。

可以看出,POST 請求需要兩步,而 GET 請求僅需一步,很明顯 GET 的用時更短,效率更高。但如果你想用 GET 來代替 POST 來優化網站性能的話,還是需要謹慎的,以為:

  • GET 和 POST 都有自己的語義,不能隨便混用;
  • 在網絡環境好的情況下,GET 和 POST 所需的時間差別基本可以無視,但是在網絡環境差的情況下,兩次包的 TCP 在驗證數據包完整性上,有非常大的優點;
  • 並不是所有的瀏覽器都會在 POST 中發送兩次包,如 Firefox 就只發送一次。

以上就是我總結的關於 GET 和 POST 的關系,望諸君雅正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM