以前面試時(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=value2Some 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=value2Some 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示例.pngPOST方法起初是用來(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ū)里留言!

