post和get的區別

2021-09-29 19:07:42 字數 3113 閱讀 1335

今天看了一篇蠻好的文章,分享記錄方便以後檢視學習

此話一出,不知激起了多少(碼農)程式設計師的憤怒,卻又無可奈何,於是碼農問程式設計師。

碼農:你知道get和post請求到底有什麼區別?

程式設計師:你看這篇就知道了。

碼農:你月薪三萬了?

程式設計師:嗯。

碼農:你是怎麼做到的?

程式設計師:我做夢做到的

前言這個問題幾乎面試的時候都會問到,是乙個老生常談的話題,然而隨著不斷的學習,對於以前的認識有很多誤區,所以還是需要不斷地總結的,學而時習之,不亦說乎。

服務端響應response也由四個部分組成,分別是:狀態行、訊息報頭、空行、響應正文

1.2 請求方法

http請求可以使用多種請求方法。

http1.0定義了三種請求方法: get, post 和 head方法。

http1.1新增了五種請求方法:options, put, delete, trace 和 connect 方法。

http2.0 新的二進位制格式(binary format),http1.x的解析是基於文字。基於文字協議的格式解析存在天然缺陷,文字的表現形式有多樣性,要做到健壯性考慮的場景必然很多,二進位制則不同,只認0和1的組合。基於這種考慮http2.0的協議解析決定採用二進位制格式,實現方便且健壯。

多路復用(multiplexing),即連線共享,即每乙個request都是是用作連線共享機制的。乙個request對應乙個id,這樣乙個連線上可以有多個request,每個連線的request可以隨機的混雜在一起,接收方可以根據request的 id將request再歸屬到各自不同的服務端請求裡面。

header壓縮,如上文中所言,對前面提到過http1.x的header帶有大量資訊,而且每次都要重**送,http2.0使用encoder來減少需要傳輸的header大小,通訊雙方各自cache乙份header fields表,既避免了重複header的傳輸,又減小了需要傳輸的大小。

1 get 請求指定的頁面資訊,並返回實體主體。

2 head 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭

3 post 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。post請求可能會導致新的資源的建立和/或已有資源的修改。

4 put 從客戶端向伺服器傳送的資料取代指定的文件的內容。

5 delete 請求伺服器刪除指定的頁面。

6 connect http/1.1協議中預留給能夠將連線改為管道方式的**伺服器。

7 options 允許客戶端檢視伺服器的效能。

8 trace 回顯伺服器收到的請求,主要用於測試或診斷。

1.3 我們耳熟能詳的的區別

http協議最常見的兩種方法get和post,這幾點答案其實有幾點並不準確

請求快取:get 會被快取,而post不會

收藏書籤:get可以,而post不能

保留瀏覽器歷史記錄:get可以,而post不能

用處:get常用於取回資料,post用於提交資料

安全性:post比get安全

請求引數:querystring 是url的一部分get、post都可以帶上。 get的querystring(僅支援urlencode編碼),post的引數是放在body(支援多種編碼)

請求引數長度限制:get請求長度最多1024kb,post對請求資料沒有限制

02 常見的誤區

get和post誤區

針對上面常見的區別,如果面試的時候這麼說,肯定是有很大的毛病,剛在學校面試的時候也曾經囫圇吞棗地這樣說過,現在回過頭再想以前的錯誤認知,又有許多新的認識。

2.1 誤區一

「用處:get常用於取回資料,post用於提交資料」

請求引數

get是querystring(僅支援urlencode編碼),post是放在body(支援多種編碼)

query引數是url的一部分,而get、post等是請求方法的一種,不管是哪種請求方法,都必須有url,而url的query是可選的,可有可無。

2.2 誤區二

「請求引數長度限制:get請求長度最多1024kb,post對請求資料沒有限制」

這句話看上去實在沒毛病啊,菜鳥教程也是這樣說的啊。雖然字面意思上沒有錯誤,但是理解一定要正確。我想說的是get方法提交的url引數資料大小沒有限制,在http協議中沒有對url長度進行限制(不僅僅是querystring的長度),這個限制是特定的瀏覽器及伺服器對他的限制

下面就是對各種瀏覽器和伺服器的最大處理能力做一些說明

ie瀏覽器對url的最大限制為2083個字元

firefox (browser):對於firefox瀏覽器url的長度限制為65,536個字元。

safari (browser):url最大長度限制為 80,000個字元。

opera (browser):url最大長度限制為190,000個字元。

google (chrome):url最大長度限制為8182個字元。

apache (server):能接受最大url長度為8,192個字元。

microsoft internet information server(iis):能接受最大url的長度為16,384個字元。

所以為了符合所有標準,url的最好不好超過最低標準的2083個字元(2k+35)。當然在做客戶端程式時,url並不展示給使用者,只是個程式呼叫,這時長度只收web伺服器的影響了。對於中文的傳遞,乙個漢字最終編碼後的字元長度是9個字元。

2.3 誤區三

「post比get安全性要高」

這裡的安全是相對性,並不是真正意義上的安全,通過get提交的資料都將顯示到url上,頁面會被瀏覽器快取,其他人檢視歷史記錄會看到提交的資料,而post不會。另外get提交資料還可能會造成csrf攻擊。

2.4 誤區四:「get產生乙個tcp資料報;post產生兩個tcp資料報。」

這一點理解起來還是有一定難度的,實際上,不論哪一種瀏覽器,在傳送 post 的時候都沒有帶 expect 頭,server 也自然不會發 100 continue。通過抓包發現,儘管會分兩次,body 就是緊隨在 header 後面傳送的,根本不存在『等待伺服器響應』這一說。

從另乙個角度說,tcp 是傳輸層協議。別人問你應用層協議裡的 get 和 post 有啥區別,你回答說這倆在傳輸層上傳送資料的時候不一樣,確定別人不抽你?

參考資料:

get和post的區別

在b s應用程式中,前台與後台的資料互動,都是通過html中form表單完成的。form提供了兩種資料傳輸的方式 get和post。雖然它們都是資料的提交方式,但是在實際傳輸時確有很大的不同,並且可能會對資料產生嚴重的影響。雖然為了方便的得到變數值,web容器已經遮蔽了二者的一些差異,但是了解二者的...

post和get的區別?

1.get是從伺服器上獲取資料,post是向伺服器傳送資料。get 和 post只是一種傳遞資料的方式,get也可以把資料傳到伺服器,他們的本質都是傳送請求和接收結果。只是組織格式和資料量上面有差別,http協議裡面有介紹。2.get是把引數資料佇列加到提交表單的action屬性所指的url中,值和...

post和get的區別

兩者的主要區別在資料傳送方式和接收方式上 1 在客戶端 get方式是通過url提交資料 post方式是提交後位址列是不變的 2 在伺服器端 get方式是利用解析位址列字串的方式,伺服器獲取get提交的值 post方式是以form的形式提交表單引數 一般來說,盡量避免使用get方式提交表單,因為有可能...