關(guān)于HTTP的一點(diǎn)總結(jié)(一)—— GET和POST

以前面試時(shí)多次被問(wèn)到過(guò)GET和POST的區(qū)別,看到HTTP權(quán)威指南里這兩個(gè)方法的內(nèi)容時(shí),我覺(jué)得自己的想法可能有點(diǎn)問(wèn)題,所以做點(diǎn)總結(jié)如下。

關(guān)于這兩個(gè)方法,w3schools 里是這么說(shuō)的,這和我以前的想法非常吻合:

The GET Method

GET is used to request data from a specified resource.

Note that the query string (name/value pairs) is sent in the URL of a GET request:

/test/demo_form.php?name1=value1&name2=value2

Some other notes on GET requests:

  • GET requests can be cached
  • GET requests remain in the browser history
  • GET requests can be bookmarked
  • GET requests should never be used when dealing with sensitive data
  • GET requests have length restrictions
  • GET requests is only used to request data (not modify)

The POST Method

POST is used to send data to a server to create/update a resource.

The data sent to the server with POST is stored in the request body of the HTTP request:

POST /test/demo_form.php HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

Some other notes on POST requests:

  • POST requests are never cached
  • POST requests do not remain in the browser history
  • POST requests cannot be bookmarked
  • POST requests have no restrictions on data length

HTTP權(quán)威指南里是這么說(shuō)的:

GET是最常用的方法,通常用于請(qǐng)求服務(wù)器發(fā)送某個(gè)資源。HTTP/1.1要求服務(wù)器實(shí)現(xiàn)此方法。圖3-7顯示了一個(gè)例子,在這個(gè)例子中,客戶(hù)端用GET方法發(fā)起了一次HTTP請(qǐng)求。

GET示例.png

POST方法起初是用來(lái)向服務(wù)器輸入數(shù)據(jù)的。實(shí)際上,通常會(huì)用它來(lái)支持HTML的表單。表單中填好的數(shù)據(jù)通常會(huì)發(fā)送給服務(wù)器,然后由服務(wù)將它發(fā)送到它要去的地方(比如,送到一個(gè)服務(wù)器網(wǎng)關(guān)程序,然后由這個(gè)程序?qū)ζ溥M(jìn)行處理)。圖3-10顯示了一個(gè)用POST方法發(fā)起HTTP請(qǐng)求 —— 向服務(wù)器發(fā)送表單數(shù)據(jù) —— 的客戶(hù)端。

POST示例.png

讓我產(chǎn)生疑惑的是權(quán)威指南里并沒(méi)有說(shuō)w3schools里的那些區(qū)別,這會(huì)讓我覺(jué)得它們只有語(yǔ)義上的區(qū)別 —— GET方法通常用于請(qǐng)求服務(wù)器發(fā)送某個(gè)資源而POST方法用來(lái)向服務(wù)器輸入數(shù)據(jù)。除此之外別無(wú)二致。

w3schools 里說(shuō)的幾點(diǎn)區(qū)別又是怎么回事呢?

GET requests have length restrictions / POST requests have no restrictions on data length

關(guān)于這一點(diǎn)我查了之后發(fā)現(xiàn),長(zhǎng)度限制并不是HTTP協(xié)議規(guī)定的,而是瀏覽器和web服務(wù)器共同作用的結(jié)果。

每種瀏覽器都有自己的URL長(zhǎng)度限制,這一點(diǎn)應(yīng)該眾所周知。但有一點(diǎn)我以前不知道的是,不同的Web服務(wù)器(Apache/ngnix/IIS)也會(huì)有不同的長(zhǎng)度限制,并且根據(jù)服務(wù)器的處理能力以及設(shè)置的不同,也會(huì)有不同的作用結(jié)果。

GET requests should never be used when dealing with sensitive data

關(guān)于這一點(diǎn),我有一些疑問(wèn),如果使用抓包工具或者打開(kāi)瀏覽器控制臺(tái),POST請(qǐng)求中傳遞的數(shù)據(jù)同樣可以一覽無(wú)余。所以我覺(jué)得w3schools的這個(gè)說(shuō)法不太嚴(yán)謹(jǐn)。硬要討論安全性的話(huà),GET請(qǐng)求應(yīng)該只是看起來(lái)比POST請(qǐng)求安全一些。

GET requests can be cached / POST requests are never cached
GET requests remain in the browser history / POST requests do not remain in the browser history
GET requests can be bookmarked / POST requests cannot be bookmarked

關(guān)于這幾點(diǎn),應(yīng)該說(shuō)是不算區(qū)別的區(qū)別。因?yàn)镚ET請(qǐng)求的參數(shù)作為URL的一部分,在瀏覽器的作用下, 才有了這幾點(diǎn)區(qū)別,也不關(guān)HTTP什么事。

GET requests is only used to request data (not modify)

我認(rèn)為這一點(diǎn)也不是絕對(duì)的。如果使用GET方法來(lái)請(qǐng)求一個(gè)服務(wù)端接口,該接口也可以在接收到請(qǐng)求時(shí)對(duì)數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)修改,這取決于部署在應(yīng)用服務(wù)器上的服務(wù)端代碼功能。所以我覺(jué)得w3schools這么說(shuō),應(yīng)該只是從語(yǔ)義上規(guī)范我們最好這么來(lái)做。

我不知道HTTP的底層實(shí)現(xiàn)里有沒(méi)有體現(xiàn)“GET requests is only used to request data (not modify)”,或者說(shuō),我不知道“GET requests is only used to request data (not modify)”究竟是怎么體現(xiàn)的。如果你知道這一點(diǎn),或者有其他觀點(diǎn),非常希望能夠在評(píng)論區(qū)里留言!

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

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

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