1. 程式人生 > >我所理解的post與get請求區別

我所理解的post與get請求區別

Get和Post一般的區別:  1.post更安全(不會作為url的一部分,不會被快取、儲存在伺服器日誌、以及瀏覽器瀏覽記錄中)  2.post傳送的資料更大(get有url長度限制)  

get傳參最大長度的理解誤區  1)總結  (1)http協議並未規定get和post的長度限制  (2)get的最大長度限制是因為瀏覽器和web伺服器限制了URL的長度  (3)不同的瀏覽器和web伺服器,限制的最大長度不一樣  (4)要支援IE,則最大長度為2083byte,若支援Chrome,則最大長度8182byte

2)誤解  (1)首先即使get有長度限制,也是限制的整個URL的長度,而不僅僅是引數值資料長度,http協議從未規定get/post的請求長度限制是多少  (2)所謂的請求長度限制是由瀏覽器和web伺服器決定和設定的,各種瀏覽器和web伺服器的設定均不一樣,這依賴於各個瀏覽器廠家的規定或者可以根據web伺服器的處理能力來設定。IE 和 Safari 瀏覽器 限制 2k,Opera 限制4k,Firefox 限制 8k(非常老的版本 256byte),如果超出了最大長度,大部分的伺服器直接截斷,也有一些伺服器會報414錯誤。

3)各個瀏覽器和web伺服器的最大長度總結  瀏覽器  (1)IE 對url長度限制是2083(2K+53)。  (2)firefox(火狐瀏覽器)的url長度限制為 65536字元。  (3)chrome(谷歌)的url長度限制超過8182個字元返回本文開頭時列出的錯誤。  (4)Safari的url長度限制至少為 80 000 字元。  (5)Opera 瀏覽器的url長度限制為190 000 字元。  伺服器  (1)Apache:Apache能接受url長度限制為8 192 字元  (2)IIS:Microsoft Internet Information Server(IIS)能接受url長度限制為16384個字元。

3.post能傳送更多的資料型別(get只能傳送ASCII字元)  4.get請求比post請求快,大約快1/3. 

為什麼get比post更快  1)post請求包含更多的請求頭  因為post需要在請求的body部分包含資料,所以會多了幾個資料描述部分的首部欄位(如:content-type),這其實是微乎其微的。

2)最重要的一條,post在真正接收資料之前會先將請求頭髮送給伺服器進行確認,然後才真正傳送資料  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響應  也就是說,目測get的總耗是post的2/3左右,這個網上已經有網友進行過測試。

3)get會將資料快取起來,而post不會  使用ajax採用get方式請求靜態資料(比如html頁面,圖片)的時候,如果兩次傳輸的資料相同,第二次以後消耗的時間將會在10ms以內(chrome測試),而post每次消耗的時間都差不多。經測試,chrome和firefox下如果檢測到get請求的是靜態資源,則會快取,如果是資料,則不會快取,但是IE什麼都會快取起來,

5.Apache、IIS、Nginx等絕大多數web伺服器,都不允許靜態檔案響應POST請求,會報405Method not allowed,因為post請求一般會動態生成資源或跟新舊資源,然很多靜態頁面不允許更改。  6.post用於修改和寫入資料,get一般用於搜尋排序和篩選之類的操作(淘寶,支付寶的搜尋查詢都是get提交),目的是資源的獲取,讀取資料