1. 程式人生 > >Http協議請求和響應

Http協議請求和響應

一、基本的知識點

Http協議:Hyper Text Transfer Protocol (超文字傳輸協議)。主要用於從全球資訊網(www)伺服器傳輸超文字到本地瀏覽器的傳輸協議。它基於ICP/IP通訊來傳輸協議資料(圖片,HTML,查詢結果等)。

工作原理:http協議作用於客戶端-服務端架構上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端傳送資料請求。

web的伺服器主要包含:Apache伺服器、IIS伺服器等。

web伺服器接收到請求後,向客戶端傳送響應的資料內容。

web伺服器預設的埠號是80,也能改。

 二、客戶端請求訊息

1、請求方法(GET/POST)、URI、協議/版本

2、請求頭(Request Header)

3、請求正文

http請求為例:

1.請求方法:請求 GET /ISAPI/System/time HTTP/1.1。這條協議方法為:GET. HTTP/1.1表示:協議和協議的版本。

根據HTTP標準,HTTP請求可以使用多種請求方法。

HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

序號 方法 描述
1 GET 請求指定的頁面資訊,並返回實體主體。
2 HEAD 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
3 POST 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
4 PUT 從客戶端向伺服器傳送的資料取代指定的文件的內容。
5 DELETE 請求伺服器刪除指定的頁面。
6 CONNECT HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。
7 OPTIONS 允許客戶端檢視伺服器的效能。
8 TRACE 回顯伺服器收到的請求,主要用於測試或診斷。

2.請求頭(Request Header):請求頭包含許多有關的客戶端環境和請求正文的有用資訊。

User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko    //使用者傳送請求的客戶端環境
Content-Type application/xml; charset=utf-8  //資料的格式
Host: xg.mediportal.com.cn   //請求資源的Intenet主機和埠號
Connection: Keep-Alive   //持久連線
Accept-Encoding gzip, deflate   //瀏覽器能夠進行解碼的資料編碼方式
Content-Length: //請求正文的長度

應答頭 說明
Allow

伺服器支援哪些請求方法(如GET、POST等)。

Content-Encoding

文件的編碼(Encode)方法。只有在解碼之後才可以得到Content-Type頭指定的內容型別。利用gzip壓縮文件能夠顯著地減少HTML文件的下載時間。Java的GZIPOutputStream可以很方便地進行gzip壓縮,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支援它。因此,Servlet應該通過檢視Accept-Encoding頭(即request.getHeader("Accept-Encoding"))檢查瀏覽器是否支援gzip,為支援gzip的瀏覽器返回經gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面。

Content-Length

表示內容長度。只有當瀏覽器使用持久HTTP連線時才需要這個資料。如果你想要利用持久連線的優勢,可以把輸出文件寫入 ByteArrayOutputStream,完成後檢視其大小,然後把該值放入Content-Length頭,最後通過byteArrayStream.writeTo(response.getOutputStream()傳送內容。

Content-Type

表示後面的文件屬於什麼MIME型別。Servlet預設為text/plain,但通常需要顯式地指定為text/html。由於經常要設定Content-Type,因此HttpServletResponse提供了一個專用的方法setContentType。

Date

當前的GMT時間。你可以用setDateHeader來設定這個頭以避免轉換時間格式的麻煩。

Expires

應該在什麼時候認為文件已經過期,從而不再快取它?

Last-Modified

文件的最後改動時間。客戶可以通過If-Modified-Since請求頭提供一個日期,該請求將被視為一個條件GET,只有改動時間遲於指定時間的文件才會返回,否則返回一個304(Not Modified)狀態。Last-Modified也可用setDateHeader方法來設定。

Location

表示客戶應當到哪裡去提取文件。Location通常不是直接設定的,而是通過HttpServletResponse的sendRedirect方法,該方法同時設定狀態程式碼為302。

Refresh

表示瀏覽器應該在多少時間之後重新整理文件,以秒計。除了重新整理當前文件之外,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面。
注意這種功能通常是通過設定HTML頁面HEAD區的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實現,這是因為,自動重新整理或重定向對於那些不能使用CGI或Servlet的HTML編寫者十分重要。但是,對於Servlet來說,直接設定Refresh頭更加方便。

注意Refresh的意義是"N秒之後重新整理本頁面或訪問指定頁面",而不是"每隔N秒重新整理本頁面或訪問指定頁面"。因此,連續重新整理要求每次都發送一個Refresh頭,而傳送204狀態程式碼則可以阻止瀏覽器繼續重新整理,不管是使用Refresh頭還是<META HTTP-EQUIV="Refresh" ...>。

注意Refresh頭不屬於HTTP 1.1正式規範的一部分,而是一個擴充套件,但Netscape和IE都支援它。

Server

伺服器名字。Servlet一般不設定這個值,而是由Web伺服器自己設定。

Set-Cookie

設定和頁面關聯的Cookie。Servlet不應使用response.setHeader("Set-Cookie", ...),而是應使用HttpServletResponse提供的專用方法addCookie。參見下文有關Cookie設定的討論。

WWW-Authenticate

客戶應該在Authorization頭中提供什麼型別的授權資訊?在包含401(Unauthorized)狀態行的應答中這個頭是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。
注意Servlet一般不進行這方面的處理,而是讓Web伺服器的專門機制來控制受密碼保護頁面的訪問(例如.htaccess)。

3、請求正文:請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經結束,接下來的是請求正文。

三、HTTP伺服器響應資訊

HTTP應答與HTTP請求相似,HTTP響應也由3個部分構成,分別是:

1、狀態行

2、響應頭(Response Header)

3、響應正文

http響應為例:

1、狀態行:由協議版本、數字形式的狀態程式碼、及相應的狀態描述,各元素之間以空格分隔。

HTTP狀態碼分類
分類 分類描述
1** 資訊,伺服器收到請求,需要請求者繼續執行操作
2** 成功,操作被成功接收並處理
3** 重定向,需要進一步的操作以完成請求
4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
5** 伺服器錯誤,伺服器在處理請求的過程中發生了錯誤

常見的HTTP狀態碼:

  • 200 - 請求成功
  • 301 - 資源(網頁等)被永久轉移到其它URL
  • 404 - 請求的資源(網頁等)不存在
  • 500 - 內部伺服器錯誤

2、響應頭(Response Header)

響應頭 說明 示例 狀態
Access-Control-Allow-Origin 指定哪些網站可以跨域源資源共享 Access-Control-Allow-Origin: * 臨時
Accept-Patch 指定伺服器所支援的文件補丁格式 Accept-Patch: text/example;charset=utf-8 固定
Accept-Ranges 伺服器所支援的內容範圍 Accept-Ranges: bytes 固定
Age 響應物件在代理快取中存在的時間,以秒為單位 Age: 12 固定
Allow 對於特定資源的有效動作; Allow: GET, HEAD 固定
Cache-Control 通知從伺服器到客戶端內的所有快取機制,表示它們是否可以快取這個物件及快取有效時間。其單位為秒 Cache-Control: max-age=3600 固定
Connection 針對該連線所預期的選項 Connection: close 固定
Content-Disposition 對已知MIME型別資源的描述,瀏覽器可以根據這個響應頭決定是對返回資源的動作,如:將其下載或是開啟。 Content-Disposition: attachment; filename="fname.ext" 固定
Content-Encoding 響應資源所使用的編碼型別。 Content-Encoding: gzip 固定
Content-Language 響就內容所使用的語言 Content-Language: zh-cn 固定
Content-Length 響應訊息體的長度,用8進位制位元組表示 Content-Length: 348 固定
Content-Location 所返回的資料的一個候選位置 Content-Location: /index.htm 固定
Content-MD5 響應內容的二進位制 MD5 雜湊值,以 Base64 方式編碼 Content-MD5: IDK0iSsgSW50ZWd0DiJUi== 已淘汰
Content-Range 如果是響應部分訊息,表示屬於完整訊息的哪個部分 Content-Range: bytes 21010-47021/47022 固定
Content-Type 當前內容的MIME型別 Content-Type: text/html; charset=utf-8 固定
Date 此條訊息被髮送時的日期和時間(以RFC 7231中定義的"HTTP日期"格式來表示) Date: Tue, 15 Nov 1994 08:12:31 GMT 固定
ETag 對於某個資源的某個特定版本的一個識別符號,通常是一個 訊息雜湊 ETag: "737060cd8c284d8af7ad3082f209582d" 固定
Expires 指定一個日期/時間,超過該時間則認為此迴應已經過期 Expires: Thu, 01 Dec 1994 16:00:00 GMT 固定: 標準
Last-Modified 所請求的物件的最後修改日期(按照 RFC 7231 中定義的“超文字傳輸協議日期”格式來表示) Last-Modified: Dec, 26 Dec 2015 17:30:00 GMT 固定
Link 用來表示與另一個資源之間的型別關係,此型別關係是在RFC 5988中定義 Link: ; rel="alternate" 固定
Location 用於在進行重定向,或在建立了某個新資源時使用。 Location: http://www.itbilu.com/nodejs 固定
P3P P3P策略相關設定 P3P: CP="This is not a P3P policy! 固定
Pragma 與具體的實現相關,這些響應頭可能在請求/迴應鏈中的不同時候產生不同的效果 Pragma: no-cache 固定
Proxy-Authenticate 要求在訪問代理時提供身份認證資訊。 Proxy-Authenticate: Basic 固定
Public-Key-Pins 用於防止中間攻擊,宣告網站認證中傳輸層安全協議的證書雜湊值 Public-Key-Pins: max-age=2592000; pin-sha256="……"; 固定
Refresh 用於重定向,或者當一個新的資源被建立時。預設會在5秒後重新整理重定向。 Refresh: 5; url=http://itbilu.com
Retry-After 如果某個實體臨時不可用,那麼此協議頭用於告知客戶端稍後重試。其值可以是一個特定的時間段(以秒為單位)或一個超文字傳輸協議日期。
  • 示例1:Retry-After: 120
  • 示例2: Retry-After: Dec, 26 Dec 2015 17:30:00 GMT

固定

Server 伺服器的名稱 Server: nginx/1.6.3 固定
設定HTTP cookie Set-Cookie: UserID=itbilu; Max-Age=3600; Version=1 固定: 標準
Status 通用閘道器介面的響應頭欄位,用來說明當前HTTP連線的響應狀態。 Status: 200 OK
Trailer Trailer使用者說明傳輸中分塊編碼的編碼資訊 Trailer: Max-Forwards 固定
Transfer-Encoding 用表示實體傳輸給使用者的編碼形式。包括:chunkedcompress、 deflategzipidentity Transfer-Encoding: chunked 固定
Upgrade 要求客戶端升級到另一個高版本協議。 Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 固定
Vary 告知下游的代理伺服器,應當如何對以後的請求協議頭進行匹配,以決定是否可使用已快取的響應內容而不是重新從原伺服器請求新的內容。 Vary: * 固定
Via 告知代理伺服器的客戶端,當前響應是通過什麼途徑傳送的。 Via: 1.0 fred, 1.1 itbilu.com (nginx/1.6.3) 固定
Warning 一般性警告,告知在實體內容體中可能存在錯誤。 Warning: 199 Miscellaneous warning 固定
WWW-Authenticate 表示在請求獲取這個實體時應當使用的認證模式。 WWW-Authenticate: Basic 固定

3.響應正文

下圖就是http伺服器響應的正文內容了。