1.HTTP請求格式:
<request line>
<headers>
<blank line>
[<request-body>]
在HTTP請求中,第一行必須是一個請求行(request line),用來說明請求類型、要訪問的資源以及使用的HTTP版本。緊接著是一個首部(header)小節,用來說明服務器要使用的附加信息。在首部之后是一個空行,再此之后可以添加任意的其他數據[稱之為主體(body)]。
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 %>
(http://blog.csdn.net/notbadgirl/article/details/3876096)
相關資料:
如何使用SOCKET 發送HTTP1.1 GET POST請求包
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報文頭如下:
Accept: */*
Accept-Language: zh-cn
host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
Connection:close
sn=123&n=asa
指出,此post數據中包含兩項
sn=123
n=asa
其中:Content-Type: application/x-www-form-urlencoded 指定POST數據的編碼類型
Content-Length: 12 POST數據的長度
GET:
GET報問頭如下:
Accept: */*
Accept-Language: zh-cn
host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
Connection:close
2 {
3 S8 tmp_buf[20];
4 const S8 * http_methods_table[MEF_TOTAL_HTTP_ACTIONS] = {"GET", "POST", "HEAD", "PUT", "OPTIONS", "DELETE", "TRACE", "CONNECT"};
5
6 sprintf(head,"%s ", http_methods_table[method]);
7 if(action)
8 {
9 strcat(head, action);
10 }
11
12 strcat(head," HTTP/1.1");
13 strcat(head,"/r/n");
14
15 strcat(head,"Accept:*/*");
16 strcat(head,"/r/n");
17
18 strcat(head,"User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
19 strcat(head,"/r/n");
20
21 strcat(head,"Host: ");
22 strcat(head,server);
23 strcat(head,"/r/n");
24
25 if(method == MEF_HTTP_POST)
26 {
27 strcat(head,"Content-Type: application/x-www-form-urlencoded");
28 strcat(head,"/r/n");
29 }
30
31 if(method == MEF_HTTP_POST)
32 {
33 strcat(head, "Content-Length: ");
34 sprintf(tmp_buf, "%d", strlen(msg_body));
35 strcat(head, tmp_buf);
36 strcat(head,"/r/n");
37 }
38 if(connect_type == 1)
39 strcat(head,"Connection: Keep-Alive");
40 else
41 strcat(head,"Connection: close");
42
43 strcat(head,"/r/n");
44 strcat(head,"/r/n");
45
46 if(method == MEF_HTTP_POST)
47 {
48 if(msg_body)
49 {
50 strcat(head,msg_body);
51 }
52 }
53 }