HTTP的報文格式、GET和POST格式解析
1、
HTTP報文格式
HTTP報文是面向文字的,報文中的每一個欄位都是一些ASCII碼串,各個欄位的長度是不確定的。HTTP有兩類報文:請求報文和響應報文。 請求報文 一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求資料4個部分組成,下圖給出了請求報文的一般格式。
(1)請求行 請求行由請求方法欄位、URL欄位和HTTP協議版本欄位3個欄位組成,它們用空格分隔。例如,GET /index.html HTTP/1.1。 HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。這裡介紹最常用的GET方法和POST方法。 GET:當客戶端要從伺服器中讀取文件時,使用GET方法。GET方法要求伺服器將URL定位的資源放在響應報文的資料部分,回送給客戶端。使用GET方法時,請求引數和對應的值附加在URL後面,利用一個問號(“?”)代表URL的結尾與請求引數的開始,傳遞引數長度受限制。例如,/index.jsp?id=100&op=bind。 POST:當客戶端給伺服器提供資訊較多時可以使用POST方法。POST方法將請求引數封裝在HTTP請求資料中,以名稱/值的形式出現,可以傳輸大量資料,可用來傳送檔案。 (2)請求頭部 請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知伺服器有關於客戶端請求的資訊,典型的請求頭有: User-Agent:產生請求的瀏覽器型別。 Accept:客戶端可識別的內容型別列表。 Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。 (3)空行 最後一個請求頭之後是一個空行,傳送回車符和換行符,通知伺服器以下不再有請求頭。 對於一個完整的http請求來說空行是必須的,否則伺服器會認為本次請求的資料尚未完全傳送到伺服器,處於等待狀態。 (4)請求資料 請求資料不在GET方法中使用,而是在POST方法中使用。POST方法適用於需要客戶填寫表單的場合。與請求資料相關的最常使用的請求頭是Content-Type和Content-Length。 (5)請求示例 POST: POST報文頭如下:
POST /sn/index.php HTTP/1.1 Accept: */* Accept-Language: zh-cn host: localhost
Content-Type: application/x-www-form-urlencoded Content-Length: 12 Connection:close sn=123&n=asa 在http頭後邊有一空行,空行後邊接著傳送post資料,長度通過Content-Length: 12 指出,此post資料中包含兩項 sn=123 n=asa 其中:Content-Type: application/x-www-form-urlencoded 指定POST資料的編碼型別 Content-Length: 12 POST資料的長度 GET: GET報問頭如下: GET /sn/index.php?sn=123&n=asa HTTP/1.1 Accept: */* Accept-Language: zh-cn host: localhost
Content-Type: application/x-www-form-urlencoded Content-Length: 12 Connection:close
2.GET與POST區別
HTTP定義了與伺服器互動的不同方法,最基本的方法是 GET 和 POST.
HTTP-GET和HTTP-POST是使用HTTP的標準協議動詞,用於編碼和傳送變數名/變數值對引數,並且使用相關的請求語義。每個HTTP-GET和HTTP-POST都由一系列HTTP請求頭組成,這些請求頭定義了客戶端從伺服器請求了什麼,而響應則是由一系列HTTP應答頭和應答資料組成,如果請求成功則返回應答。 HTTP-GET以使用MIME型別application/x-www-form-urlencoded的urlencoded文字的格式傳遞引數。Urlencoding是一種字元編碼,保證被傳送的引數由遵循規範的文字組成,例如一個空格的編碼是"%20"。附加引數還能被認為是一個查詢字串。 與HTTP-GET類似,HTTP-POST引數也是被URL編碼的。然而,變數名/變數值不作為URL的一部分被傳送,而是放在實際的HTTP請求訊息內部被傳送。
(1)get是從伺服器上獲取資料,post是向伺服器傳送資料。
(1) 在客戶端,Get方式在通過URL提交資料,資料在URL中可以看到;POST方式,資料放置在HTML HEADER內提交。
(2) 對於get方式,伺服器端用Request.QueryString獲取變數的值,對於post方式,伺服器端用Request.Form獲取提交的資料。
(2) GET方式提交的資料最多隻能有1024位元組,而POST則沒有此限制。
(3) 安全性問題。正如在(1)中提到,使用 Get 的時候,引數會顯示在位址列上,而 Post 不會。所以,如果這些資料是中文資料而且是非敏感資料,那麼使用 get;如果使用者輸入的資料不是中文字元而且包含敏感資料,那麼還是使用 post為好。
注:所謂安全的意味著該操作用於獲取資訊而非修改資訊。冪等的意味著對同一 URL 的多個請求應該返回同樣的結果。完整的定義並不像看起來那樣嚴格。換句話說,GET 請求一般不應產生副作用。從根本上講,其目標是當用戶開啟一個連結時,她可以確信從自身的角度來看沒有改變資源。比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是安全的和冪等的,因為它總是返回當前的新聞。反之亦然。POST 請求就不那麼輕鬆了。POST 表示可能改變伺服器上的資源的請求。仍然以新聞站點為例,讀者對文章的註解應該通過 POST 請求實現,因為在註解提交之後站點已經不同了(比方說文章下面出現一條註解)。
下面舉一個簡單的例子來說明它們的區別:
<!-分別通過get和post方式提交表單--> <FORM ACTION="getpost.asp" METHOD="get"> <INPUT TYPE="text" NAME="Text" VALUE="http://wxf0701.cnblogs.com//> <INPUT TYPE="submit" VALUE="Get方式"></INPUT> </FORM> <BR> <FORM ACTION="getpost.asp" METHOD="post"> <INPUT TYPE="text" NAME="Text" VALUE="http://wxf0701.cnblogs.com/> <INPUT TYPE="submit" VALUE="Post方式"></INPUT> </FORM> <BR>
<% If Request.QueryString("Text") <> "" Then %> 通過get方式傳遞的字串是: "<B><%= Request.QueryString("Text") %></B>"<BR> <% End If %>
<% If Request.Form("Text") <> "" Then %> 通過Post方式傳遞的字串是: "<B><%= Request.Form("Text") %></B>"<BR> <% End If %>