Get請求和Post請求的區(qū)別?

從 HTTP 報(bào)文的角度出發(fā),來分辨get和post請求的區(qū)別。

W3CSchool上比較官方的比較說明

比較 GET 與 POST
下面的表格比較了兩種 HTTP 方法:GET 和 POST。

但是,不同的瀏覽器上,對于HTTP標(biāo)準(zhǔn)可能會(huì)實(shí)現(xiàn)不同。

GET 和 POST 報(bào)文上的區(qū)別

先下結(jié)論,GET 和 POST 方法沒有實(shí)質(zhì)區(qū)別,只是報(bào)文格式不同。

GET 和 POST 只是 HTTP 協(xié)議中兩種請求方式,而 HTTP 協(xié)議是基于 TCP/IP 的應(yīng)用層協(xié)議,無論 GET 還是 POST,用的都是同一個(gè)傳輸層協(xié)議,所以在傳輸上,沒有區(qū)別。

報(bào)文格式上,不帶參數(shù)時(shí),最大區(qū)別就是第一行方法名不同

POST方法請求報(bào)文第一行是這樣的POST /uri HTTP/1.1 \r\n

GET方法請求報(bào)文第一行是這樣的 GET /uri HTTP/1.1 \r\n

是的,不帶參數(shù)時(shí)他們的區(qū)別就僅僅是報(bào)文的前幾個(gè)字符不同而已

帶參數(shù)時(shí)報(bào)文的區(qū)別呢? 在約定中,GET 方法的參數(shù)應(yīng)該放在 url 中,POST 方法參數(shù)應(yīng)該放在 body 中

舉個(gè)例子,如果參數(shù)是name=qiming.c, age=22。

GET 方法簡約版報(bào)文是這樣的

GET /index.php?name=qiming.c&age=22 HTTP/1.1
Host: localhost

POST 方法簡約版報(bào)文是這樣的

POST /index.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded

name=qiming.c&age=22

現(xiàn)在我們知道了兩種方法本質(zhì)上是 TCP 連接,沒有差別,也就是說,如果我不按規(guī)范來也是可以的。我們可以在 URL 上寫參數(shù),然后方法使用 POST;也可以在 Body 寫參數(shù),然后方法使用 GET。當(dāng)然,這需要服務(wù)端支持。

常見問題疑惑

一、GET 方法參數(shù)寫法是固定的嗎?

在約定中,一般我們的參數(shù)是寫在 ? 后面,用 & 分割。

我們知道,解析報(bào)文的過程是通過獲取 TCP 數(shù)據(jù),用正則等工具從數(shù)據(jù)中獲取 Header 和 Body,從而提取參數(shù)。

也就是說,我們可以自己約定參數(shù)的寫法,只要服務(wù)端能夠解釋出來就行,一種比較流行的寫法是這樣 :http://www.example.com/user/name/yourname/age/22

二、POST 方法比 GET 方法安全?

按照網(wǎng)上大部分文章的解釋,POST 比 GET 安全,因?yàn)閿?shù)據(jù)在地址欄上不可見。

然而從傳輸?shù)慕嵌葋碚f,他們都是不安全的,因?yàn)?HTTP 在網(wǎng)絡(luò)上是明文傳輸,只要在網(wǎng)絡(luò)節(jié)點(diǎn)上抓包,就能完整地獲取數(shù)據(jù)報(bào)文。

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

三、聽說 GET 方法參數(shù)長度有限制?

在網(wǎng)上看到很多關(guān)于兩者區(qū)別的文章都有這一條,提到瀏覽器地址欄輸入的參數(shù)是有限的。

首先說明一點(diǎn),其實(shí)HTTP 協(xié)議本身倒并沒有 Body 和 URL 的長度限制,對 URL 限制的大多是瀏覽器和服務(wù)器端自己限制的。

瀏覽器原因就不說了,服務(wù)器是因?yàn)樘幚黹L URL 要消耗比較多的資源,為了性能和安全(防止惡意構(gòu)造長 URL 來攻擊)考慮,會(huì)給 URL 長度加限制。

然后我們可以得出結(jié)論,url 長度限制是某些瀏覽器和服務(wù)器的限制,和 HTTP 協(xié)議沒有關(guān)系

四、POST 方法會(huì)產(chǎn)生兩個(gè)TCP數(shù)據(jù)包?

有些文章中提到,POST 請求會(huì)將 Header 和 Body 分開發(fā)送,先發(fā)送 Header,服務(wù)端返回 100 狀態(tài)碼再發(fā)送 Body。

HTTP 協(xié)議中也并沒有明確說明 POST 會(huì)產(chǎn)生兩個(gè) TCP 數(shù)據(jù)包,而且實(shí)際測試(Chrome)發(fā)現(xiàn),Header 和 Body 不會(huì)分開發(fā)送。

所以,Header 和 Body 分開發(fā)送是部分瀏覽器或框架的請求方法,不屬于 Post的必然行為。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容