一篇文章幫助你理解get、post

一篇文章幫助你理解get、post

先說最實用的應用場景:

簡單地說:一般用get獲取數據,用post提交、修改數據。

稍具體一點就是
若符合下列任一情況,則用POST方法:

  1. 請求的結果有持續性的副作用,例如,數據庫內添加新的數據行。
  2. 若使用GET方法,則表單上收集的數據可能讓URL過長。
  3. 要傳送的數據不是採用7位的ASCII編碼。

若符合下列任一情況,則用GET方法:

  1. 請求是爲了查找資源,HTML表單數據僅用來幫助搜索。
  2. 請求結果無持續性的副作用。
  3. 收集的數據及HTML表單內的輸入字段名稱的總長不超過1024個字符。

考慮一下原因,可以看看上述情況分別對應後面說的get、post的哪些區別。

理解:
GET和POST是什麼? HTTP協議中的兩種請求方式。

HTTP是什麼? HTTP是基於TCP/IP的關於數據如何在萬維網中如何通信的協議。

HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP鏈接。

所以說get/post在本質上沒啥區別。

區別:

1、多數瀏覽器中GET產生一個TCP數據包;POST產生兩個TCP數據包。
對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);
而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。

雖然看似POST需要兩步,時間上消耗的要多一點,GET比POST更有效,但是GET與POST都有自己的語義,不能隨便混用。
據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點。
並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。

2、GET提交,請求的數據會附在URL之後(就是把數據放置在HTTP協議頭中)
以?分割URL和傳輸數據,多個參數用&連接;
例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。
如果數據是英文字母/數字,原樣發送,如果是空格,轉換爲+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX爲該符號以16進製表示的ASCII。

POST提交:把提交的數據放置在是HTTP包的包體(body)中。

因此,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變

2、傳輸數據的大小
首先聲明:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規範也沒有對URL長度進行限制。

而在實際開發中存在的限制主要有:

GET:特定瀏覽器和服務器對URL長度有限制,例如 IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系 統的支持。

因此對於GET提交時,傳輸數據就會受到URL長度的 限制。

POST:由於不是通過URL傳值,理論上數據不受 限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自的配置。

3、安全性

POST的安全性要比GET的安全性高。比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,
因爲(1)登錄頁面有可能被瀏覽器緩存;(2)其他人查看瀏覽器的歷史紀錄,那麼別人就可以拿到你的賬號和密碼了,除此之外,使用GET提交數據還可能會造成Cross-site request forgery攻擊

4、Http get,post,soap協議都是在http上運行的

(1)get:請求參數是作爲一個key/value對的序列(查詢字符串)附加到URL上的
查詢字符串的長度受到web瀏覽器和web服務器的限制(如IE最多支持2048個字符),不適合傳輸大型數據集同時,它很不安全

(2)post:請求參數是在http標題的一個不同部分(名爲entity body)傳輸的,這一部分用來傳輸表單信息,因此必須將Content-type設置爲:application/x-www-form- urlencoded。post設計用來支持web窗體上的用戶字段,其參數也是作爲key/value對傳輸。
但是:它不支持複雜數據類型,因爲post沒有定義傳輸數據結構的語義和規則。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章