HTTP請求報文與響應報文


一、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響應行:主要是設置響應狀態等信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM