都2023年了,還問GET和POST的區別

2022-09-13 22:57:35 字數 3305 閱讀 3779

在我大全球資訊網世界中,tcp就像汽車,我們用tcp來運輸資料,它很可靠,從來不會發生丟件少件的現象。但是如果路上跑的全是看起來一模一樣的汽車,那這個世界看起來是一團混亂,送急件的汽車可能被前面滿載貨物的汽車攔堵在路上,整個交通系統一定會癱瘓。為了避免這種情況發生,交通規則http誕生了。http給汽車運輸設定了好幾個服務類別,有get, post, put, delete等等,http規定,當執行get請求的時候,要給汽車貼上get的標籤(設定method為get),而且要求把傳送的資料放在車頂上(url中)以方便記錄。如果是post請求,就要在車上貼上post的標籤,並把貨物放在車廂裡。當然,你也可以在get的時候往車廂內偷偷藏點貨物,但是這是很不光彩;也可以在post的時候在車頂上也放一些資料,讓人覺得傻乎乎的。http只是個行為準則,而tcp才是get和post怎麼實現的基本。

但是,我們只看到http對get和post引數的傳送渠道(url還是requrest body)提出了要求。「標準答案」裡關於引數大小的限制又是從哪來的呢?

在我大全球資訊網世界中,還有另乙個重要的角色:運輸公司。不同的瀏覽器(發起http請求)和伺服器(接受http請求)就是不同的運輸公司。 雖然理論上,你可以在車頂上無限的堆貨物(url中無限加引數)。但是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,資料量太大對瀏覽器和伺服器都是很大負擔。業界不成文的規定是,(大多數)瀏覽器通常都會限制url長度在2k個位元組,而(大多數)伺服器最多處理64k大小的url。超過的部分,恕不處理。如果你用get服務,在request body偷偷藏了資料,不同伺服器的處理方式也是不同的,有些伺服器會幫你卸貨,讀出資料,有些伺服器直接忽略,所以,雖然get可以帶request body,也不能保證一定能被接收到哦。

好了,現在你知道,get和post本質上就是tcp鏈結,並無差別。但是由於http的規定和瀏覽器/伺服器的限制,導致他們在應用過程中體現出一些不同。 

get和post還有乙個重大區別,簡單的說:

get產生乙個tcp資料報;post產生兩個tcp資料報。

長的說:

對於get方式的請求,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料);

而對於post,瀏覽器先傳送header,伺服器響應100 continue,瀏覽器再傳送data,伺服器響應200 ok(返回資料)。

也就是說,get只需要汽車跑一趟就把貨送到了,而post得跑兩趟,第一趟,先去和伺服器打個招呼「嗨,我等下要送一批貨來,你們開啟門迎接我」,然後再回頭把貨送過去。

1. get與post都有自己的語義,不能隨便混用。

2. 據研究,在網路環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網路環境差的情況下,兩次包的tcp在驗證資料報完整性上,有非常大的優點。

3. 並不是所有瀏覽器都會在post中傳送兩次包,firefox就只傳送一次。

本文**自

最近看了一些同學的面經,發現無論什麼技術崗位,還是會問到 get 和 post 的區別,而搜尋出來的答案並不能讓我們裝得一手好逼,那就讓我們從 http 報文的角度來擼一波,從而搞明白他們的區別。

在開擼之前嗎,讓我們先看一下標準答案長什麼樣子w3school: get 對比 post。標準答案很美好,但是在面試的時候把下面的**甩面試官一臉,估計會裝逼不成反被*。

注意,並不是說標準答案有誤,上述區別在大部分瀏覽器上是存在的,因為這些瀏覽器實現了 http 標準。

所以從標準上來看,get 和 post 的區別如下:

但是,既然本文從報文角度來說,那就先不討論 rfc 上的區別,單純從資料角度談談。

先下結論,get 和 post 方法沒有實質區別,只是報文格式不同。

get 和 post 只是 http 協議中兩種請求方式,而 http 協議是基於 tcp/ip 的應用層協議,無論 get 還是 post,用的都是同乙個傳輸層協議,所以在傳輸上,沒有區別。

報文格式上,不帶引數時,最大區別就是第一行方法名不同

post方法請求報文第一行是這樣的post /uri http/1.1 \r\n

get方法請求報文第一行是這樣的get /uri http/1.1 \r\n

是的,不帶引數時他們的區別就僅僅是報文的前幾個字元不同而已

帶引數時報文的區別呢? 在約定中,get 方法的引數應該放在 url 中,post 方法引數應該放在 body 中

舉個例子,如果引數是 name=qiming.c, age=22。

get 方法簡約版報文是這樣的

post 方法簡約版報文是這樣的

現在我們知道了兩種方法本質上是 tcp 連線,沒有差別,也就是說,如果我不按規範來也是可以的。我們可以在 url 上寫引數,然後方法使用 post;也可以在 body 寫引數,然後方法使用 get。當然,這需要服務端支援。

在約定中,我們的引數是寫在?後面,用&分割。

我們知道,解析報文的過程是通過獲取 tcp 資料,用正則等工具從資料中獲取 header 和 body,從而提取引數。

也就是說,我們可以自己約定引數的寫法,只要服務端能夠解發布來就行,一種比較流行的寫法

然而,從傳輸的角度來說,他們都是不安全的,因為 http 在網路上是明文傳輸的,只要在網路節點上捉包,就能完整地獲取資料報文。

要想安全傳輸,就只有加密,也就是 https。

首先說明一點,http 協議沒有 body 和 url 的長度限制,對 url 限制的大多是瀏覽器和伺服器的原因。

瀏覽器原因就不說了,伺服器是因為處理長 url 要消耗比較多的資源,為了效能和安全(防止惡意構造長 url 來攻擊)考慮,會給 url 長度加限制。

有些文章中提到,post 會將 header 和 body 分開傳送,先傳送 header,服務端返回 100 狀態碼再傳送 body。

http 協議中沒有明確說明 post 會產生兩個 tcp 資料報,而且實際測試(chrome)發現,header 和 body 不會分開傳送。

所以,header 和 body 分開傳送是部分瀏覽器或框架的請求方法,不屬於 post 必然行為。

本文**自

SpringMVC中post和get的區別

這是一篇我在csdn上的第一篇部落格,請大家多多支援。在前面我先宣告 這篇文章的內容基本上都是網上各部落格的,我只是整理一下,給需要的人梳理一下而已。首先先放個人覺得比較好的關於post和get的區別的分析的鏈結 在講區別前先講一下 requestbody。requestbody主要用來接收前端傳遞...

html css基礎篇 GET和POST的區別

本文前面部分 木 葉的博文 後面有本人自己的一些總結和體會。如果有人問你,get和post,有什麼區別?你會如何回答?前幾天有人問我這個問題。我說get是用於獲取資料的,post,一般用於將資料發給伺服器之用。這個答案好像並不是他想要的。於是他繼續追問有沒有別的區別?我說這就是個名字而已,如果伺服器...

iOS開發 基礎篇 get和post請求的區別

1 get,它用於獲取資訊,注意,他只是獲取 查詢資料,也就是說它不會修改伺服器上的資料,從這點來講,它是資料安全的,而稍後會提到的post它是可以修改資料的,所以這也是兩者差別之一了。3 delete 刪除資料。可以通過get post來實現。用的不多,暫不多寫,以後擴充。4 put,增加 放置資...