HTTP報文是面向文本的,報文中的每一個字段都是一些ASCII碼串,各個字段的長度是不確定的。
首先要搞清楚HTTP 請求報文的結構,在發送時才能進行請求得拼接
一個HTTP請求報文由請求行(request line)、請求頭(header)、空行和請求數據4個部分組成。要發送一個完整的HTTP請求必須遵照此格式
1、請求行:
請求方法 URL HTTP協議版本
ex: POST /index.html HTTP/1.1
GET:當客戶端要從服務器中讀取文檔時,使用GET方法。GET方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。使用GET方法時,請求參數和對應的值附加在URL後面,利用一個問號(“?”)代表URL的結尾與請求參數的開始,傳遞參數長度受限制。例如,/index.jsp?id=100&op=bind。(get請求參數可見)
POST:當客戶端給服務器提供信息較多時可以使用POST方法。POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,可以傳輸大量數據,可用來傳送文件。(POST請求參數不可見)
2、請求頭:
請求頭一般由幾個鍵值對構成,每行一對,用於通知服務器有關客戶端請求的信息,典型的請求頭有:
User-Agent:產生請求的瀏覽器類型。
Accept:客戶端可識別的內容類型列表。
Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。
ex:
Host:www.baidu.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,en-US;q=0.4,en-GB;q=0.2(q表示用戶偏好設定)
常見的HTTP請求頭
協議頭
|
說明
|
示例
|
狀態
|
Accept
|
可接受的響應內容類型(Content-Types)。
|
Accept: text/plain
|
固定
|
Accept-Charset
|
可接受的字符集
|
Accept-Charset: utf-8
|
固定
|
Accept-Encoding
|
可接受的響應內容的編碼方式。
|
Accept-Encoding: gzip, deflate
|
固定
|
Accept-Language
|
可接受的響應內容語言列表。
|
Accept-Language: en-US
|
固定
|
Accept-Datetime
|
可接受的按照時間來表示的響應內容版本
|
Accept-Datetime: Sat, 26 Dec 2015 17:30:00 GMT
|
臨時
|
Authorization
|
用於表示HTTP協議中需要認證資源的認證信息
|
Authorization: Basic OSdjJGRpbjpvcGVuIANlc2SdDE==
|
固定
|
Cache-Control
|
用來指定當前的請求/回覆中的,是否使用緩存機制。
|
Cache-Control: no-cache
|
固定
|
Connection
|
客戶端(瀏覽器)想要優先使用的連接類型
|
Connection: keep-alive
Connection: Upgrade
|
固定
|
Cookie
|
由之前服務器通過Set-Cookie(見下文)設置的一個HTTP協議Cookie
|
Cookie: $Version=1; Skin=new;
|
固定:標準
|
Content-Length
|
以8進製表示的請求體的長度
|
Content-Length: 348
|
固定
|
Content-MD5
|
請求體的內容的二進制 MD5 散列值(數字簽名),以 Base64 編碼的結果
|
Content-MD5: oD8dH2sgSW50ZWdyaIEd9D==
|
廢棄
|
Content-Type
|
請求體的MIME類型 (用於POST和PUT請求中)
|
Content-Type: application/x-www-form-urlencoded
|
固定
|
Date
|
|
Date: Dec, 26 Dec 2015 17:30:00 GMT
|
固定
|
Expect
|
表示客戶端要求服務器做出特定的行爲
|
Expect: 100-continue
|
固定
|
From
|
發起此請求的用戶的郵件地址
|
|
固定
|
Host
|
表示服務器的域名以及服務器所監聽的端口號。如果所請求的端口是對應的服務的標準端口(80),則端口號可以省略。
|
Host: www.itbilu.com:80
Host: www.itbilu.com
|
固定
|
If-Match
|
僅當客戶端提供的實體與服務器上對應的實體相匹配時,才進行對應的操作。主要用於像 PUT 這樣的方法中,僅當從用戶上次更新某個資源後,該資源未被修改的情況下,才更新該資源。
|
If-Match: "9jd00cdj34pss9ejqiw39d82f20d0ikd"
|
固定
|
If-Modified-Since
|
允許在對應的資源未被修改的情況下返回304未修改
|
If-Modified-Since: Dec, 26 Dec 2015 17:30:00 GMT
|
固定
|
If-None-Match
|
允許在對應的內容未被修改的情況下返回304未修改( 304 Not Modified ),參考 超文本傳輸協議 的實體標記
|
If-None-Match: "9jd00cdj34pss9ejqiw39d82f20d0ikd"
|
固定
|
If-Range
|
如果該實體未被修改過,則向返回所缺少的那一個或多個部分。否則,返回整個新的實體
|
If-Range: "9jd00cdj34pss9ejqiw39d82f20d0ikd"
|
固定
|
If-Unmodified-Since
|
僅當該實體自某個特定時間以來未被修改的情況下,才發送迴應。
|
If-Unmodified-Since: Dec, 26 Dec 2015 17:30:00 GMT
|
固定
|
Max-Forwards
|
限制該消息可被代理及網關轉發的次數。
|
Max-Forwards: 10
|
固定
|
Origin
|
發起一個針對跨域資源共享的請求(該請求要求服務器在響應中加入一個Access-Control-Allow-Origin的消息頭,表示訪問控制所允許的來源)。
|
Origin: http://www.itbilu.com
|
固定: 標準
|
Pragma
|
與具體的實現相關,這些字段可能在請求/迴應鏈中的任何時候產生。
|
Pragma: no-cache
|
固定
|
Proxy-Authorization
|
用於向代理進行認證的認證信息。
|
Proxy-Authorization: Basic IOoDZRgDOi0vcGVuIHNlNidJi2==
|
固定
|
Range
|
表示請求某個實體的一部分,字節偏移以0開始。
|
Range: bytes=500-999
|
固定
|
Referer
|
表示瀏覽器所訪問的前一個頁面,可以認爲是之前訪問頁面的鏈接將瀏覽器帶到了當前頁面。Referer其實是Referrer這個單詞,但RFC製作標準時給拼錯了,後來也就將錯就錯使用Referer了。
|
Referer: http://itbilu.com/nodejs
|
固定
|
TE
|
瀏覽器預期接受的傳輸時的編碼方式:可使用迴應協議頭Transfer-Encoding中的值(還可以使用"trailers"表示數據傳輸時的分塊方式)用來表示瀏覽器希望在最後一個大小爲0的塊之後還接收到一些額外的字段。
|
TE: trailers,deflate
|
固定
|
User-Agent
|
瀏覽器的身份標識字符串
|
User-Agent: Mozilla/……
|
固定
|
Upgrade
|
要求服務器升級到一個高版本協議。
|
Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
|
固定
|
Via
|
告訴服務器,這個請求是由哪些代理髮出的。
|
Via: 1.0 fred, 1.1 itbilu.com.com (Apache/1.1)
|
固定
|
Warning
|
一個一般性的警告,表示在實體內容體中可能存在錯誤。
|
Warning: 199 Miscellaneous warning
|
固定
|
3、空行:
最後一個請求頭之後是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭。
對於一個完整的http請求來說空行是必須的,否則服務器會認爲本次請求的數據尚未完全發送到服務器,處於等待狀態。
4、請求數據
請求數據不在GET方法中使用,而是在POST方法中使用。POST方法適用於需要客戶填寫表單的場合。與請求數據相關的最常使用的請求頭是Content-Type和Content-Length。
完整請求EX:
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數據的長度
EX2:
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