這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰html
最近我在作前端面試題總結系列,感興趣的朋友能夠添加關注,歡迎指正、交流。前端
爭取每一個知識點可以多總結一些,至少要作到在面試時,針對每一個知識點均可以侃起來,不至於啞火。git
在先後端交互的過程當中,使用頻率最高的莫過於 GET 和 POST 這兩個方法,而且這也是面試中被問到頻率很高的知識點。web
面試經常會問:GET 和 POST 方法的區別是什麼?面試
這個問題經常會致使咱們只關心了它們兩個之間的一些差別,而忽略了它們之間的共性,因此對於問題的回答就略顯淺顯。編程
今天咱們就來深扒一下兩個方法到底有何異同。後端
若是我要說, GET 和 POST 的本質是相同的,不知道有多少人會有異議?瀏覽器
GET 和 POST 方法只是 HTTP 協議爲了避免同分工而規定的兩種請求方式。緩存
HTTP 是什麼?HTTP 是基於 TCP/IP 的關於數據如何在萬維網中如何通訊的協議。安全
HTTP 的底層是 TCP/IP。因此 GET 和 POST 的底層也是 TCP/IP,也就是說,GET 和 POST 都是 TCP 連接。因此說,它們的本質是相同的。
GET 和 POST 之因此產生,要經過HTTP的規則和瀏覽器/服務器的限制進行區分,使它們在應用過程當中體現出不一樣。
整個請求過程大概是這樣的:
雖說 GET 和 POST 請求的本質是相同的 —— 都是 TCP 鏈接,可是,在平時的使用中仍是存在必定區別的。
咱們這裏所說的區別其實都是約定俗成的一些東西,有些區別的界限可能不是很明確。
既然是爲了避免同分工而產生的兩種方法,那麼它們做用確定是不一樣的:
其實這是一句廢話,之因此列出來,是爲了內容更全面一些。
這一點應該是咱們可以最直觀地觀察到的。
?
跟在 URL 後面的,多個參數經過 &
鏈接,好比:www.example.com?serach=bianchengsanmei&content=123
。request body
中的其實,這個區別不是絕對的,GET 也能夠經過 params 攜帶參數,而 POST 的URL 後面也能夠攜帶參數,只是咱們一般不建議這麼作而已。
由於參數傳遞方式的不一樣,因此 GET 和 POST 的安全性不一樣:GET 比 POST 更不安全,由於參數直接暴露在URL上,因此 GET 不能用來傳遞敏感信息。
從傳輸的角度來講,他們都是不安全的,由於 HTTP 在網絡上是明文傳輸的,只要在網絡節點上捉包,就能完整地獲取數據報文,要想安全傳輸,就只有加密,也就是 HTTPS。
GET 和 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 和 POST 請求時間的不一樣主要是由於:
對於 GET 方式的請求,瀏覽器會把 header 和 data 一併發送出去,服務器響應 200(返回數據);而對於 POST,瀏覽器先發送 Header,服務器響應 100 continue,瀏覽器再發送 data,服務器響應 200 ok(返回數據),詳細分析一下:
瀏覽器請求 TCP 鏈接(第一次握手)
服務器答應進行 TCP 鏈接(第二次握手)
瀏覽器確認,併發送 POST 請求頭(第三次握手,這個報文比較小,因此 HTTP 會在此時進行第一次數據發送)
服務器返回100 Continue響應
瀏覽器發送數據
服務器返回 200 OK響應
在網絡環境好的狀況下,發一次包的時間和發兩次包的時間差異基本能夠無視。而在網絡環境差的狀況下,兩次包的TCP在驗證數據包完整性上,有很是大的優勢。
GET 和 POST 的異同點就總結了這麼多,因爲時間倉促,疏漏之處在所不免,歡迎指正,本文會持續改進!
~
~本文完,感謝閱讀!
~
學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!
你們好,我是〖編程三昧〗的做者 隱逸王,個人公衆號是『編程三昧』,歡迎關注,但願你們多多指教!
你來,懷揣指望,我有墨香相迎! 你歸,不管得失,惟以餘韻相贈!
知識與技能並重,內力和外功兼修,理論和實踐兩手都要抓、兩手都要硬!
參考資料:
[3] POST與GET的區別