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連線狀態請求頭和請求正文之間是一個空行,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字串資訊:
username=jinqiao&password=1234
在以上的例子中,請求的正文只有一行內容。當然,在實際應用中,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首部欄位。。。