1. 程式人生 > >Http協議之"get和post的區別"

Http協議之"get和post的區別"

來源---面試中常問的一個問題:get資料請求方式與post的區別

比較老的歷史:HTTP與伺服器互動的方式為put,delete,post,get

分別對應增,刪,改查。

從字面上看,get是獲取資料,post是修改資料。

那麼現在還是這樣嗎?(思考)

先上兩者的區別吧:

  1. get把資料放在url上,即HTTP協議頭上;而post把資料放在HTTP請求體內(request body)。
  2. get提交的資料最大為2k(原則上url長度無限制,限制實際上取決於瀏覽器,大多數瀏覽器從都會限制url長度在2k個位元組);post理論上沒有限制,實際中,IIS4中最大量為80K,IIS5中為100KB。
  3. get產生一個TCP資料包,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料);而post會產生兩個資料包,瀏覽器先發送header,伺服器響應100 continue,瀏覽器再次傳送data,伺服器響應200 OK(返回資料)。
  4. get請求會被瀏覽器主動cache;而post不會,除非手動設定。
  5. get請求引數會被完整保留在瀏覽器歷史記錄裡;而post中的引數不會被保留。
  6. get只接受ASCII字元的引數的型別;而post沒有限制。

對以上總結的解答:

1、為啥get比post傳送資料快

1)post請求包含更多的請求頭

解釋:post需要在請求體中包含部分資料,多了一些資料描述部分的首部欄位(如,content-type)

2)post在真正接收資料之前會先將請求頭髮送給伺服器進行確認,然後才真正傳送資料(比get方式多了一個等待100 Continue的過程)

post請求過程:

  1. 瀏覽器請求tcp連線(第一次握手)
  2. 伺服器響應瀏覽器的tcp連線(第二次握手)
  3. 瀏覽器確認,併發送post請求頭(第三次握手,這個請求頭報文比較小,所以http會在此時進行第一次資料分析傳送)
  4. 伺服器返回100 Continue響應
  5. 瀏覽器傳送資料
  6. 伺服器返回200 OK響應

get請求過程:

  1. 瀏覽器請求tcp連線(第一次握手)
  2. 伺服器響應瀏覽器的tcp連線(第二次握手)
  3. 瀏覽器確認,併發送get請求頭
    資料(第三次握手)
  4. 伺服器返回200 OK響應

3)get會快取資料,而post不會

如果連續兩次以上資料請求,get方式在第二次時請求資料時,將靜態資料(如html頁面,圖片等)快取下來,而post則不會,它會每次去請求。

4)post方式不能徑向管道化傳輸

http權威指南中是這樣說的:http的一次會話需要先建立tcp連線(大部分是tcp,但是其他安全協議也是可以的),然後才能通訊,如果 每次連線都只進行一次http會話,那這個連線過程佔的比例太大了!於是出現了持久連線:在http/1.0+中是connection首部中新增keep-alive值,在http/1.1中是在connection首部中新增persistent值,當然兩者不僅僅是命名上的差別,http/1.1中,持久連線是預設的,除非顯示在connection中新增close,否則持久連線不會關閉,而http/1.0+中則恰好相反,除非顯示在connection首部中新增keep-alive,否則在接收資料包後連線就斷開了。 
出現了持久連線還不夠,在http/1.1中,還有一種稱為管道通訊的方式進行速度優化:把需要傳送到伺服器上的所有請求放到輸出佇列中,在第一個請求傳送出去後,不等到收到伺服器的應答,第二個請求緊接著就傳送出去,但是這樣的方式有一個問題:不安全,如果一個管道中有10個連線,在傳送出9個後,突然伺服器告訴你,連線關閉了,此時客戶端即使收到了前9個請求的答覆,也會將這9個請求的內容清空,也就是說,白忙活了……此時,客戶端的這9個請求需要重新發送。這對於冪等請求還好(比如get,多傳送幾次都沒關係,每次都是相同的結果),如果是post這樣的非冪等請求(比如支付的時候,多傳送幾次就慘了),肯定是行不通的。 
所以,post請求不能通過管道的方式進行通訊!很有可能,post請求需要重新建立連線,這個過程不跟完全沒優化的時候一樣了麼?所以,在可以使用get請求通訊的時候,不要使用post請求,這樣使用者體驗會更好,當然,如果有安全性要求的話,post會更好。管道化傳輸在瀏覽器端的實現還需考證,貌似預設情況下大部分瀏覽器(除了opera)是不進行管道化傳輸的,除非手動開啟!

2、get傳輸引數有最大長度限制

解釋:

  1. http協議併為規定get和post的長度限制
  2. get方式有長度限制是因為瀏覽器和web伺服器限制了URL的長度
  3. 不同的瀏覽器和web伺服器,限制的最大長度不一樣
  4. 要支援IE,則最大長度為2083byte,若支援Chrome,則最大長度為8182byte

3.各個瀏覽器和web伺服器的最大長度總結 
瀏覽器 
(1)IE:IE瀏覽器(Microsoft Internet Explorer) 對url長度限制是2083(2K+53),超過這個限制,則自動截斷(若是form提交則提交按鈕不起作用)。 
(2)firefox:firefox(火狐瀏覽器)的url長度限制為 65536字元,但實際上有效的URL最大長度不少於100,000個字元。 
(3)chrome:chrome(谷歌)的url長度限制超過8182個字元返回本文開頭時列出的錯誤。 
(4)Safari:Safari的url長度限制至少為 80 000 字元。 
(5)Opera:Opera 瀏覽器的url長度限制為190 000 字元。Opera9 位址列中輸入190000字元時依然能正常編輯。 
伺服器 
(1)Apache:Apache能接受url長度限制為8 192 字元 
(2)IIS:Microsoft Internet Information Server(IIS)能接受url長度限制為16384個字元。這個是可以通過修改的(IIS7)