HTTP中GET與POST的區別 99%的錯誤認識

本篇文章分兩部分,第一部分能夠列爲初爲新人的裝逼失敗模式,第二部分列爲修煉低調模式。
裝逼失敗模式:99%的人對GET和POST的認識
修煉低調模式:1%不知道的進階認識面試

GET和POST,在咱們平常WEB開發中,是最經常使用的數據傳輸方式。面試中咱們也常常會遇到。
通常咱們在瀏覽器輸入一個網址URL訪問網站都是GET方式請求;
在HTML FROM表單中,能夠經過設置method指定提交方式爲GET或者POST方式,默認爲GET提交方式後端

HTTP定義了與服務器交互的不一樣方法,其中最基本的四種:GET,POST,PUT,DELETE,HEAD;
其中GET和HEAD被稱爲安全方法,由於使用GET和HEAD的HTTP請求不會產生什麼動做。不會產生動做意味着GET和HEAD的HTTP請求不會在服務器上產生任何結果。可是安全方法並非什麼動做都不產生,這裏的安全方法僅指不會修改信息。瀏覽器

GET和POST咱們比較經常使用,其它幾種實際應用比較少用到,在此僅做了解。緩存


99%的人所認爲的GET和POST

1. 傳輸方式(自我理解「顯示方式」)

GET請求的數據會附加在URL以後,以?分割URL和傳輸數據,多個參數之間以&鏈接,
"http://www.xxx.com/product?type=shoe&price=100&sex=male"
數據格式有如下注意點:安全

  1. 若是數據是英文字母/數字,原樣發送;
  2. 若是是空格,轉換爲+;
  3. 若是是中文或其餘字符,則把數據用Base64加密,
    "%E4%BD%A0%E5%A5%BD"其中%XX中的XX爲該符號以16進製表示的ASCII碼。

POST請求會把請求的數據放置在HTTP請求包的包體中,GET傳輸的數據會直接暴露在URL中,而POST請求則不會。服務器

2. 傳輸數據大小

GET方式傳輸的數據最多隻能是1024字節,
由於GET是經過URL提交數據,那麼GET可提交的數據量就跟URL的長度有直接關係,URL自己不存在參數上限的問題,HTTP協議規範也沒有對URL長度進行限制。
這個限制是特定的瀏覽器及服務器對它的限制。IE對URL長度的限制是2083字節(2K+35)。對於其餘瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操做系統的支持。網絡

注意:限制是針對整個URL長度,不單是傳輸的數據長度。併發

POST方式理論上沒有限制,可傳較大的數據。起限制做用的是服務器的處理程序的處理能力。Apache, Nigx, IIS服務器自身可配置限制傳輸大小。網站

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

4. GET產生的URL能夠做爲標籤或存於歷史記錄中,而POST不能夠

5. GET請求會被瀏覽器主動cahe,而POST不會,除非手動設置

6. 安全性

GET傳輸的數據直接暴露在URL中,若是咱們在作用戶登陸時,須要傳輸登陸賬號及密碼到後端作驗證,若是用GET方式,那麼帳戶密碼直接暴露在URL裏面,是極其危險的。
並且瀏覽器緩存的機制,訪問過的網站URL會被保存在瀏覽器歷史記錄裏,其餘人可經過歷史記錄查看訪問網站URL,直接獲取到傳輸的數據。
極可能受到 "Cross-site request forgery"(中文名稱:跨站請求僞造) 攻擊。
不過POST的數據也是能夠被攔截的。加密

總結:

  1. GET請求是用來向服務器發送索取數據的一種請求,實際應用中數據不涉及到安全性,可用GET方式來向後端請求數據,
    如分頁或搜索關鍵詞 "http://www.xxx.com/product?keywords=xxx&page=2";
  2. POST請求是向服務器提交數據的一種請求,涉及到安全性的數據,用POST的方式來傳輸較GET更安全。

曾經的曾經,我也是那99%的一員,還把本身概括的文章發給新人同事看,而後裝逼失敗,被老大引導練成最後的這1%。


1%的人所擁有的

GET和POST本質上是沒有區別的,它們是HTTP協議中的兩種發送請求的方式。
HTTP是基於TCP/IP的關於數據如何在萬維網中通訊的協議,即HTTP的底層是TCP/IP,因此GET和POST的底層也是TCP/IP,也就是說:GET/POST都是TCP連接。
給POST帶上url參數,給GET加上request body,技術上是能夠實現的。

爲了更方便的管理,避免混亂,HTTP給這些請求定義GET,POST,PUT,DELETE。
而數據大小,則是由於瀏覽器的限制形成的。

因此GET和POST本質上就是TCP連接,並沒有差異。可是因爲HTTP的規定和瀏覽器/服務器的限制,致使他們在應用過程當中體現出一些不一樣

隱藏的Buff

GET產生一個TCP數據包,而POST產生兩個TCP數據包

GET的請求,瀏覽器會把http header和data一併發送出去,服務器返回200(返回數據)
POST的請求,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200(返回數據)

由於POST須要兩步,時間上消耗的多一點,
不過網絡環境好的狀況下,發一次包的時間和發兩次包的時間差異基本能夠無視。
網絡環境差的狀況下,兩次包的TCP在驗證數據包完整性上,有很是大的優勢

並非全部瀏覽器POST發送兩次包,Fiefox就發送一次。

最後的最後,當你之後被別人問到的時候,你就能夠。。。。。。請開始你的表演

參考文章:《99%的人都理解錯了HTTP中GET與POST的區別》

相關文章
相關標籤/搜索