深入理解GET和POST的區別

2021-09-26 23:24:21 字數 3329 閱讀 2479

(1)post更安全(不會作為url的一部分,不會被快取、儲存在伺服器日誌、以及瀏覽器瀏覽記錄中) 

(2)post傳送的資料更大(get有url長度限制) 

(3)post能傳送更多的資料型別(get只能傳送ascii字元) 

(4)post比get慢 

(5)post用於修改和寫入資料,get一般用於搜尋排序和篩選之類的操作(**,支付寶的搜尋查詢都是get提交),目的是資源的獲取,讀取資料 

雖然在開發中經常用get或者post請求,但是由於我們資歷經驗的欠缺,或許就重來沒有深究過什麼場合用get請求,什麼場合用post請求,我相信不止我乙個人當看到第4,5條的時候,就會明白為什麼面試官對我們的回答不滿意,也明白了自己對get或post用法理解的欠缺,那麼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什麼都會快取起來,當然,應該沒有人用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)是不進行管道化傳輸的,除非手動開啟!

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: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) 

configuration/system.webserver/security/requestfiltering/requestlimits@maxquerystringsetting.

深入理解post和get請求。

最直觀的區別就是get把引數包含在url中,post通過request body傳遞引數。http協議是基於tcp ip協議的。所以get和post的底層也是基於tcp ip協議,也就是說,get post都是tcp鏈結。get和post能做的事情是一樣一樣的。你要給get加上request bod...

面試題 深入理解get和post

推薦閱讀 微服務還能火多久?首先,我們要明白,get和post本質上都是tcp鏈結,那他們為什麼會不一樣?就好像,在網際網路世界中,http 交通規則 會給不同服務型別的tcp 汽車 貼上不同的標籤 因為標籤不同所以使用方法也不一樣。get是通過url傳遞引數,post則是將資料放置在request...

深入 Get 與 Post 區別

其實吧,get和post在本質上沒有區別,都是http協議中的兩種傳送請求的方法。而http呢,是基於tcp ip的關於資料如何在全球資訊網中如何通訊的協議。全球資訊網 簡稱www,是world wide web的簡稱,也稱為web 3w等。http的底層是tcp ip。所以get和post的底層也...