最近我在做前端面試題總結系列,感興趣的朋友可以新增關注,歡迎指正、交流。
爭取每個知識點能夠多總結一些,至少要做到在面試時,針對每個知識點都可以侃起來,不至於啞火。
前言
在前後端互動的過程中,使用頻率最高的莫過於 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
中的
其實,這個區別不是絕對的,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 請求的過程:
瀏覽器請求 TCP 連線(第一次握手)
伺服器答應進行 TCP 連線(第二次握手)
瀏覽器確認,併傳送 POST 請求頭(第三次握手,這個報文比較小,所以 HTTP 會在此時進行第一次資料傳送)
伺服器返回100 Continue響應
瀏覽器傳送資料
伺服器返回 200 OK響應
GET 請求的過程:
- 瀏覽器請求 TCP 連線(第一次握手)
- 伺服器答應進行 TCP 連線(第二次握手)
- 瀏覽器確認,併傳送 GET 請求頭和資料(第三次握手,這個報文比較小,所以 HTTP 會在此時進行第一次資料傳送)
- 伺服器返回 200 OK響應
在網路環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網路環境差的情況下,兩次包的TCP在驗證資料包完整性上,有非常大的優點。
總結
GET 和 POST 的異同點就總結了這麼多,由於時間倉促,疏漏之處在所難免,歡迎指正,本文會持續改進!
~
~本文完,感謝閱讀!
~
學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!
大家好,我是〖程式設計三昧〗的作者 隱逸王,我的公眾號是『程式設計三昧』,歡迎關注,希望大家多多指教!
你來,懷揣期望,我有墨香相迎! 你歸,無論得失,唯以餘韻相贈!
知識與技能並重,內力和外功兼修,理論和實踐兩手都要抓、兩手都要硬!
參考資料:
[3] POST與GET的區別
本作品採用《CC 協議》,轉載必須註明作者和本文連結