標籤:
轉自http://blog.csdn.net/darxin/article/details/4944225#comments
HTTP請求的GET與POST方式的本質區別可以參考hyddd在《淺談HTTP中Get與Post的區別》一文中的描述,本文講述了其中比較重要的一條,那就是資料轉送的位置不同。
GET方式在request-line中傳送資料;POST方式在request-line及request-body中均可以傳送資料
對網上傳言的解釋
傳言1:GET方式對長度有限制;POST方式對長度沒限制。
回答:長度限制之說一方面是HTTP用戶端(如IE限定URL長度為2083位元組,opera 是4050, Netscape 是8192)的限制;另一方面伺服器的實現也加入了限制(如果URL長度過長,HTTP伺服器會報414錯誤)。但HTTP協議及URL官方說明均對長度限制則沒有規定。
傳言2:GET是從伺服器上擷取資料;POST是向伺服器傳送資料。
回答:GET方式就沒有向伺服器傳送資料?那麼URL中的?子句送的是什嗎?不論是GET還是POST,都可以向伺服器傳送資料,只不過傳送資料的位置不同;不論是GET還是POST,都要從伺服器上擷取資料,否則IE瀏覽器拿什麼東西給我們看呢?關鍵的問題是
GET的主要任務是獲得資料,但在獲得資料前也可以向伺服器提交一些資料;
POST的主要任務是提交資料,但在提交資料之後伺服器也會向使用者端返回一些顯示用的資料。
傳言3:GET不安全,使用者能從地址欄上看到傳送的資料;POST安全,使用者不能從地址欄上看到傳送的資料。
回答:POST方式看不到傳送的資料是因為IE瀏覽器做了限制。如果你通過第三方工具看到了POST方式傳送的資料,你還能說POST方式是安全的嗎?理論上說GET和POST方式都不安全,要不就用不著研究HTTPS了。
HTTP的GET/POST方式有何區別?這是一個老生常談的問題,但老生常談的問題往往有一些讓人誤解的結論。本文將帶您淺嘗HTTP協議,在瞭解HTTP協議的同時將會展示許多被人們忽視的內容。在掌握了HTTP協議的過程中我們將自然而然地瞭解到GET與POST的本質區別。
HTTP請求
從使用者的角度看,一個HTTP請求起始於
使用者端瀏覽器上輸入的一個URL地址;
網頁中的一個超連結;
提交一個HTML表單。
但本質上說,一個HTTP請求起始於使用者端向HTTP伺服器發送的一個URL請求。
一個標準的HTTP請求由以下幾個部分組成
<request-line>
<headers>
<CRLF>
[<request-body><CRLF>]
在HTTP請求中,第一行是請求行(request-line),用來說明請求類型、要訪問的資源(URL)以及使用的HTTP版本;
緊接著是多行頭部(headers)資訊,用來說明伺服器要使用的附加資訊;
頭部資訊之後是一個斷行符號分行符號(/r/n),用於標明頭部資訊的結束。
以上是必須內容,根據需要可在頭部資訊結束之後增加主體資料(request-body);
主體資料之後是一個斷行符號分行符號(/r/n),用於標明主體資料的結束。
需要注意的是
請求行(request-line)中的URL部分必須以application/x-www-form-urlencoded方式編碼。
主體資料(request-body)的編碼方式由頭部(headers)資訊中的Content-Type指定。
主體資料(request-body)的長度由頭部(headers)資訊中的Content-Length指定。
例如,我們可以在IE瀏覽器上輸入下面的網址:
http://localhost:8000/hello/index.html
HTTP請求的頭部資訊如下:
GET /hello/index.html HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
Host: localhost:8000
Connection: Keep-Alive
Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6
[End]
上述資訊沒有request-body部分,這是以GET方式發送的HTTP請求。如果請求中需要附加主體資料,即增加request-body部分,則必須使用POST方式發送HTTP請求。HTML超連結(<a></a>)只能用GET方式提交HTTP請求,HTML表單(<form></form>)則可以使用兩種方式提交HTTP請求。
GET與POST的區別