一、HTTP報文是面向文本的,報文中的每一個字段都是一些ASCII碼串,各個字段的長度是不確定的。HTTP有兩類報文:請求報文和響應報文。
一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求數據4個部分組成,下圖給出了請求報文的一般格式。
網上復制了一個圖片(轉載自華山大師兄):
給一個更加清晰,明了的圖片:
以下逐步分析各個數據部分的作用。
1、請求行
請求行由請求方法字段、URL字段和HTTP協議版本字段3個字段組成,它們用空格分隔。
例如打開路徑http://www.baidu.com/index.php,用火狐瀏覽器可以查看到請求報文為:
GET /index.php HTTP/1.1
因此用空格分隔之后得到的信息為
(1)請求方法: GET
(2)URL信息: /index.php
(3)HTTP協議版本: HTTP/1.1
請求方法的類型:
1、Get:Get方法GET方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。使用GET方法時,請求參數和對應的值附加在URL后面,利用一個問號(“?”)代表URL的結尾與請求參數的開始,傳遞參數長度受限制,各個數據之間用”&”符號隔開,傳送的數據直接在瀏覽器的地址條里就能夠看到。顯然,這種方式不適合傳送私密數據。另外,由於不同的瀏覽器對地址的字符限制也有所不同,一般最多只能識別1024個字符,所以如果需要傳送大量數據的時候,也不適合使用GET方式。
2、Post:POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,可以傳輸大量數據,POST方式對傳送的數據大小沒有限制,而且也不會顯示在URL中。
Get和Post一個各有優缺點, Get方法請求的數據,都一樣,用戶可以隨意復制路徑分享給其它人,Post方法不限制請求數據量,常用於表單提交。Post方法比Get方法安全性強。
3、HEAD:就像GET,只不過服務端接受到HEAD請求后只返回響應頭,而不會發送響應內容。當我們只需要查看某個頁面的狀態的時候,使用HEAD是非常高效的,因為在傳輸的過程中省去了頁面內容。也就是說,該方法只用於測試一下當前服務器的狀態。
2、請求頭部
User-Agent:瀏覽器的具體類型 如:User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0
Accept:瀏覽器支持哪些數據類型 如:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:瀏覽器采用的是哪種編碼 如:Accept-Charset: ISO-8859-1
Accept-Encoding:瀏覽器支持解碼的數據壓縮格式 如:Accept-Encoding: gzip, deflate
Accept-Language:瀏覽器的語言環境 如:Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。Host:www.baidu.com
Connection:表示是否需要持久連接。Keep-Alive/close,HTTP1.1默認是持久連接,它可以利用持久連接的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,Servlet需要在應答中發送一個Content-Length頭,最簡單的實現方法是:先把內容寫入ByteArrayOutputStream,然后在正式寫出內容之前計算它的大小。如:Connection: Keep-Alive
Content-Length:表示請求消息正文的長度。對於POST請求來說Content-Length必須出現。
Content-Type:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集。例如:Content-Type: text/html; charset='gb2312'
Content-Encoding:WEB服務器表明自己使用了什么壓縮方法(gzip,deflate)壓縮響應中的對象。例如:Content-Encoding:gzip
Content-Language:WEB服務器告訴瀏覽器自己響應的對象的語言。
Cookie:最常用的請求頭,瀏覽器每次都會將cookie發送到服務器上,允許服務器在客戶端存儲少量數據。
Referer:包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面。服務器能知道你是從哪個頁面過來的。Referer: http://www.baidu.com/
二、HTTP響應報文
HTTP響應報文與HTTP請求報文是對應的,也是分為三個部分。
1、響應行
2、響應頭
3、響應體
給個實例:
HTTP/1.1 200 OK //響應行 Date: Sat, 31 Dec 2005 23:59:59 GMT Content-Type: text/html;charset=ISO-8859-1 Content-Length: 122 <html> <head> <title>Wrox Homepage</title> </head> <body> <!-- body goes here --> </body> </html>
HTTP響應報文常用屬性:
Cache-Control
響應輸出到客戶端后,服務端通過該報文頭屬告訴客戶端如何控制響應內容的緩存。
下面,的設置讓客戶端對響應內容緩存3600秒,也即在3600秒內,如果客戶再次訪問該資源,直接從客戶端的緩存中返回內容給客戶,不要再從服務端獲取(當然,這個功能是靠客戶端實現的,服務端只是通過這個屬性提示客戶端“應該這么做”,做不做,還是決定於客戶端,如果是自己宣稱支持HTTP的客戶端,則就應該這樣實現)。
Cache-Control: max-age=3600
ETag
一個代表響應服務端資源(如頁面)版本的報文頭屬性,如果某個服務端資源發生變化了,這個ETag就會相應發生變化。它是Cache-Control的有益補充,可以讓客戶端“更智能”地處理什么時候要從服務端取資源,什么時候可以直接從緩存中返回響應。
ETag: "737060cd8c284d8af7ad3082f209582d"
Location
我們在Asp.net中讓頁面Redirect到一個某個A頁面中,其實是讓客戶端再發一個請求到A頁面,這個需要Redirect到的A頁面的URL,其實就是通過響應報文頭的Location屬性告知客戶端的,如下的報文頭屬性,將使客戶端redirect到iteye的首頁中:
Location: http://www.google.com.hk
Set-Cookie
服務端可以設置客戶端的Cookie,其原理就是通過這個響應報文頭屬性實現的。
Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
HTTP響應體:如果請求的是HTML頁面,那么返回的就是HTML代碼。如果是JS就是JS代碼。
HTTP響應頭:而設置Cookie,緩存等信息就是在響應頭屬性設置的。
HTTP響應行:主要是設置響應狀態等信息。