一,一般現在流傳的HTTP請求:GET和POST的比較是這樣的:

GET和POST是HTTP的兩個常用方法。

什麼是HTTP?

超文本傳輸協議(HyperText Transfer Protocol -- HTTP)是一個設計來使客戶端和服務器順利進行通訊的協議。

HTTP在客戶端和服務器之間以request-responseprotocol(請求-回覆協議)工作。

GET- 從指定的服務器中獲取數據

POST- 提交數據給指定的服務器處理

GET方法:

使用GET方法時,查詢字符串(鍵值對)被附加在URL地址後面一起發送到服務器:

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

特點:

· GET請求能夠被緩存

· GET請求會保存在瀏覽器的瀏覽記錄中

· 以GET請求的URL能夠保存爲瀏覽器書籤

· GET請求有長度限制

· GET請求主要用以獲取數據

POST方法:

使用POST方法時,查詢字符串在POST信息中單獨存在,和HTTP請求一起發送到服務器:

POST/test/demo_form.jsp HTTP/1.1

Host:w3schools.com

name1=value1&name2=value2

特點:

· POST請求不能被緩存下來

· POST請求不會保存在瀏覽器瀏覽記錄中

· 以POST請求的URL無法保存爲瀏覽器書籤

· POST請求沒有長度限制

GET和POST的區別:

關於HTTP 請求方式: GET和POST的比較的本質

其他HTTP請求方式

關於HTTP 請求方式: GET和POST的比較的本質

二,本質上,這些並不是HTTP的GET和POST兩者請求的區別,這些區別是建立在HTML標準對於HTTP協議的用法的約定之上的。

1. GET和POST與數據如何傳遞沒有關係

GET和POST是由HTTP協議定義的。在HTTP協議中,Method和Data(URL, Body, Header)是正交的兩個概念,也就是說,使用哪個Method與應用層的數據如何傳輸是沒有相互關係的。

HTTP沒有要求,如果Method是POST數據就要放在BODY中。也沒有要求,如果Method是GET,數據(參數)就一定要放在URL中而不能放在BODY中。

那麼,網上流傳甚廣的這個說法是從何而來的呢?我在HTML標準中,找到了相似的描述。這和網上流傳的說法一致。但是這只是HTML標準對HTTP協議的用法的約定。怎麼能當成GET和POST的區別呢?

而且,現代的Web Server都是支持GET中包含BODY這樣的請求。雖然這種請求不可能從瀏覽器發出,但是現在的Web Server又不是隻給瀏覽器用,已經完全地超出了HTML服務器的範疇了。

2. HTTP協議對GET和POST都沒有對長度的限制

HTTP協議明確地指出了,HTTP頭和Body都沒有長度的要求。而對於URL長度上的限制,有兩方面的原因造成:

1. 瀏覽器。據說早期的瀏覽器會對URL長度做限制。據說IE對URL長度會限制在2048個字符內(流傳很廣,而且無數同事都表示認同)。但我自己試了一下,我構造了90K的URL通過IE9訪問live.com,是正常的。網上的東西,哪怕是Wikipedia上的,也不能信。

2. 服務器。URL長了,對服務器處理也是一種負擔。原本一個會話就沒有多少數據,現在如果有人惡意地構造幾個幾M大小的URL,並不停地訪問你的服務器。服務器的最大併發數顯然會下降。另一種攻擊方式是,把告訴服務器Content-Length是一個很大的數,然後只給服務器發一點兒數據,嘿嘿,服務器你就傻等着去吧。哪怕你有超時設置,這種故意的次次訪問超時也能讓服務器喫不了兜着走。有鑑於此,多數服務器出於安全啦、穩定啦方面的考慮,會給URL長度加限制。但是這個限制是針對所有HTTP請求的,與GET、POST沒有關係。

相關文章