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
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/
3.空行
最後一個請求頭之後是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭。
4.請求數據
請求數據不在GET方法中使用,而是在POST方法中使用。POST方法適用於需要客戶填寫表單的場合。與請求數據相關的最常使用的請求頭是Content-Type和Content-Length。
二、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響應行:主要是設置響應狀態等信息。
都看到這了,轉發一下吧,關注並私信“前端資源”有小驚喜哦
閱讀更多 大前端面試官 的文章