天天看點

http協定(二)請求和響應封包的構成

http協定用于用戶端和伺服器之間的通信,請求通路資源的一方稱為用戶端,而提供資源響應的一方稱為伺服器端。

下面就是用戶端和服務端之間簡單的通信過程

http協定(二)請求和響應封包的構成

PS:請求必須從用戶端建立通信,服務端沒收到請求之前不會發送響應

下面先來說說請求的構成:

1)請求方法URI協定/版本 

2)請求頭(Request Header) 

3)請求正文

下面是一個請求的例子:

GET/sample.jspHTTP/1.1

Accept:image/gif.image/jpeg,*/*

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)

Accept-Encoding:gzip,deflate

username=jinqiao&password=1234

1)請求方法URI協定/版本

以上請求中“GET”代表請求方法,“/sample.jsp”表示URI,“HTTP/1.1代表協定和協定的版本。

根據HTTP标準,HTTP請求可以使用多種請求方法。具體的方法以及差別後面我們介紹。

2)請求頭

Accept 可接受的内容類型

Accept-Language 語言

Connection連接配接狀态

Host 請求的域名(這裡我設定的是請求本地,當然,關于域名,就是所謂的URL)

User-Agent 浏覽器端浏覽器型号和版本

Accept-Encoding 可接受的壓縮類型 gzip,deflate

請求頭和請求正文之間是一個空行,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶送出的查詢字元串資訊:

在以上的例子中,請求的正文隻有一行内容。當然,在實際應用中,HTTP請求正文可以包含更多的内容。

響應的構成

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

1)狀态行

2)響應頭

3)響應正文

在接收和解釋請求消息後,伺服器會傳回一個HTTP響應消息。

狀态行由協定版本、數字形式的狀态代碼、及相應的狀态描述,各元素之間以空格分隔。

格式:    HTTP-Version Status-Code Reason-Phrase CRLF

例如:    HTTP/1.1 200 OK 

狀态代碼:

狀态代碼由3位數字組成,表示請求是否被了解或被滿足。

狀态描述:

狀态描述給出了關于狀态代碼的簡短的文字描述。

狀态代碼的第一個數字定義了響應的類别,後面兩位沒有具體的分類。

第一個數字有五種可能的取值:

- 1xx:   訓示資訊—表示請求已接收,繼續處理。

- 2xx:   成功—表示請求已經被成功接收、了解、接受。

- 3xx:   重定向—要完成請求必須進行更進一步的操作。

- 4xx:   用戶端錯誤—請求有文法錯誤或請求無法實作。

- 5xx: 伺服器端錯誤—伺服器未能實作合法的請求。

狀态代碼 狀态描述    說明

  200     OK    用戶端請求成功

  400     Bad Request   由于用戶端請求有文法錯誤,不能被伺服器所了解。

  401     Unauthonzed   請求未經授權。這個狀态代碼必須和WWW-Authenticate報頭域一起使用

  403     Forbidden   伺服器收到請求,但是拒絕提供服務。伺服器通常會在響應正文中給出不提供服務的原因

  404     Not Found   請求的資源不存在,例如,輸入了錯誤的URL。

  500     Internal Server Error 伺服器發生不可預期的錯誤,導緻無法完成用戶端的請求。

  503     Service Unavailable   伺服器目前不能夠處理用戶端的請求,在一段時間之後,伺服器可能會恢複正常。

響應頭

響應頭可能包括: 

Location:響應報頭域用于重定向接受者到一個新的位置。

Server:響應報頭域包含了伺服器用來處理請求的軟體資訊。它和User-Agent請求報頭域是相對應的,前者發送伺服器端軟體的資訊,後者發送客戶 端軟體(浏覽器)和作業系統的資訊。

Content-Encoding:實體報頭域被使用作媒體類型的修飾符,它的值訓示了已經被應用到實體正文的附加内容編碼,因而要獲得Content- Type報頭域中所引用的媒體類型,必須采用相應的解碼機制。

Content-Language:實體報頭域描述了資源所用的自然語言。Content-Language允許使用者遵照自身的首選語言來識别和區分實體。 

Content-Length:實體報頭域用于指明正文的長度,以位元組方式存儲的十進制數字來表示,也就是一個數字字元占一個位元組,用其對應的ASCII碼存儲傳輸。

要注意的是:這個長度僅僅是表示實體正文的長度,沒有包括實體報頭的長度。

Content-Type:實體報頭域用語指明發送給接收者的實體正文的媒體類型。

Last-Modified:實體報頭域用于訓示資源最後的修改日期及時間。

Expires:實體報頭域給出響應過期的日期和時間。

Expires實體報頭域使用的日期和時間必須是RFC 1123中的日期格式,例如:

Expires: Thu, 15 Sep 2005 16:00:00 GMT

下面是一個HTTP響應的例子:

HTTP/1.1 200 OK

Server:Apache Tomcat/5.0.12

Date:Mon,6Oct2003 13:23:42 GMT

Content-Length:112

從上面的例子大家可以對照着進行比對,或者自己可以嘗試在電腦上操作,這裡給大家教一個方法:

使用chrome浏覽器自帶的開發者工具檢視http頭的方法

1.在網頁任意地方右擊選擇審查元素或者按下 shift+ctrl+c或者F12, 打開chrome自帶的調試工具;

2.選擇network标簽, 重新整理網頁(在打開調試工具的情況下重新整理);

3.重新整理後在左邊找到該網頁url,點選 後右邊選擇headers,就可以看到目前網頁的http請求和響應

PS:關于請求和響應的首部字段,由于目前http協定規定的比較多,這裡就不一一列舉了,感興趣的可以百度下具體的http首部字段。。。

轉載請注明出處,商用請征得作者本人同意,謝謝!!!