[前端 · 面試 ]HTTP 總結(五)—— GET 和 POST

程式設計三昧發表於2021-08-05

最近我在做前端面試題總結系列,感興趣的朋友可以新增關注,歡迎指正、交流。

爭取每個知識點能夠多總結一些,至少要做到在面試時,針對每個知識點都可以侃起來,不至於啞火。

GET 和 POST

前言

在前後端互動的過程中,使用頻率最高的莫過於 GET 和 POST 這兩個方法,並且這也是面試中被問到頻率很高的知識點。

面試常常會問:GET 和 POST 方法的區別是什麼?

這個問題常常會導致我們只關心了它們兩個之間的一些差異,而忽略了它們之間的共性,所以對於問題的回答就略顯淺顯。

今天我們就來深扒一下兩個方法到底有何異同。

相同點

如果我要說, GET 和 POST 的本質是相同的,不知道有多少人會有異議?

GET 和 POST 方法只是 HTTP 協議為了不同分工而規定的兩種請求方式。

HTTP 是什麼?HTTP 是基於 TCP/IP 的關於資料如何在全球資訊網中如何通訊的協議。

HTTP 的底層是 TCP/IP。所以 GET 和 POST 的底層也是 TCP/IP,也就是說,GET 和 POST 都是 TCP 連結。所以說,它們的本質是相同的。

GET 和 POST 之所以產生,要通過HTTP的規則和瀏覽器/伺服器的限制進行區分,使它們在應用過程中體現出不同。

整個請求過程大概是這樣的:

  • 客戶端 IP 發出請求。
  • 發出的請求資料包會通過 TCP ,經網路傳輸給遠端服務端 IP。
  • 服務端 IP 收到請求包之後,解析並處理請求包最後服務端會通過 TCP 將處理結果返回給客戶端。
  • 使用者便可以檢視到想要的響應資料。

區別

雖然說 GET 和 POST 請求的本質是相同的 —— 都是 TCP 連線,但是,在平時的使用中還是存在一定區別的。

我們這裡所說的區別其實都是約定俗成的一些東西,有些區別的界限可能不是很明確。

作用不同

既然是為了不同分工而產生的兩種方法,那麼它們作用肯定是不同的:

  • GET 多用於從服務端獲取資源
  • POST 一般用來向服務端提交資源

其實這是一句廢話,之所以列出來,是為了內容更全面一些。

引數傳遞方式不同

這一點應該是我們能夠最直觀地觀察到的。

  • GET 的引數一般是通過 ? 跟在 URL 後面的,多個引數通過 & 連線,比如:www.example.com?serach=bianchengsanmei&content=123
  • POST 的引數一般是包含在 request body 中的image-20210805202707330

其實,這個區別不是絕對的,GET 也可以通過 params 攜帶引數,而 POST 的URL 後面也可以攜帶引數,只是我們通常不建議這麼做而已。

安全性不同

因為引數傳遞方式的不同,所以 GET 和 POST 的安全性不同:GET 比 POST 更不安全,因為引數直接暴露在URL上,所以 GET 不能用來傳遞敏感資訊。

從傳輸的角度來說,他們都是不安全的,因為 HTTP 在網路上是明文傳輸的,只要在網路節點上捉包,就能完整地獲取資料包文,要想安全傳輸,就只有加密,也就是 HTTPS。

引數長度限制不同

GET 和 POST 傳遞引數的長度不同:

  • get傳送的資料量較小,不能大於2KB。
  • post傳送的資料量較大,一般被預設為不受限制。

在這裡我們要明確一點:HTTP 協議沒有 Body 和 URL 的長度限制,對 URL 限制的大多是瀏覽器和伺服器的原因。

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

引數資料型別不同

引數的資料型別,GET 只接受 ASCII 字元,而 POST 沒有限制。

編碼方式不同

GET 請求只能進行 URL 編碼(application/x-www-form-urlencoded)

POST 支援多種編碼方式(application/x-www-form-urlencoded 或 multipart/form-data。為二進位制資料使用多重編碼。)

快取機制不同

這個需要從以下幾點來說明:

  • GET 請求會被瀏覽器主動cache,而 POST 不會,除非手動設定。
  • GET 請求引數會被完整保留在瀏覽器歷史記錄裡,而 POST 中的引數不會被保留。
  • GET 產生的 URL 地址可以被 Bookmark,而 POST 不可以。
  • GET 在瀏覽器回退時是無害的,而 POST 會再次提交請求。

時間消耗不同

GET 和 POST 請求時間的不同主要是因為:

  • GET 產生一個 TCP 資料包;
  • POST 產生兩個 TCP 資料包。

對於 GET 方式的請求,瀏覽器會把 header 和 data 一併傳送出去,伺服器響應 200(返回資料);而對於 POST,瀏覽器先傳送 Header,伺服器響應 100 continue,瀏覽器再傳送 data,伺服器響應 200 ok(返回資料),詳細分析一下:

POST 請求的過程:

  1. 瀏覽器請求 TCP 連線(第一次握手)

  2. 伺服器答應進行 TCP 連線(第二次握手)

  3. 瀏覽器確認,併傳送 POST 請求頭(第三次握手,這個報文比較小,所以 HTTP 會在此時進行第一次資料傳送)

  4. 伺服器返回100 Continue響應

  5. 瀏覽器傳送資料

  6. 伺服器返回 200 OK響應

GET 請求的過程:

  1. 瀏覽器請求 TCP 連線(第一次握手)
  2. 伺服器答應進行 TCP 連線(第二次握手)
  3. 瀏覽器確認,併傳送 GET 請求頭和資料(第三次握手,這個報文比較小,所以 HTTP 會在此時進行第一次資料傳送)
  4. 伺服器返回 200 OK響應

在網路環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網路環境差的情況下,兩次包的TCP在驗證資料包完整性上,有非常大的優點。

總結

GET 和 POST 的異同點就總結了這麼多,由於時間倉促,疏漏之處在所難免,歡迎指正,本文會持續改進!

~

~本文完,感謝閱讀!

~

學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!

大家好,我是〖程式設計三昧〗的作者 隱逸王,我的公眾號是『程式設計三昧』,歡迎關注,希望大家多多指教!

你來,懷揣期望,我有墨香相迎! 你歸,無論得失,唯以餘韻相贈!

知識與技能並重,內力和外功兼修,理論和實踐兩手都要抓、兩手都要硬!

參考資料:

[1] GET和POST兩種基本請求方法的區別

[2] 面試必備:GET和POST的區別詳細解說

[3] POST與GET的區別

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章