[toc]
# HTTP 消息結構
* 基于
HTTP是基于客戶端/服務端(C/S)的架構模型,通過一個可靠的鏈接來交換信息,是一個無狀態(tài)的請求/響應協議。
* HTTP"客戶端" 請求者
一個HTTP"客戶端"是一個應用程序(Web瀏覽器或其他任何客戶端),通過連接到服務器達到向服務器發(fā)送一個或多個HTTP的請求的目的。
* HTTP"服務器" 反饋者
一個HTTP"服務器"同樣也是一個應用程序(通常是一個Web服務,如Apache Web服務器或IIS服務器等),通過接收客戶端的請求并向客戶端發(fā)送HTTP響應數據。
* URL作用
HTTP使用統一資源標識符(Uniform Resource Identifiers, URI)來傳輸數據和建立連接。
一旦建立連接后,數據消息就通過類似Internet郵件所使用的格式[RFC5322]和多用途Internet郵件擴展(MIME)[RFC2045]來傳送。
* HTTP協議的報文格式
客戶端發(fā)送的HTTP報文,我們稱為請求鏈;中介服務器或Web服務器發(fā)送的HTTP報文,稱為響應鏈。兩種報文都遵循以下格式:
* 一般開始行,即請求報文的請求行和應答報文的狀態(tài)行;
* 總頭;
* 報文頭;
* 一個空行;
* 報文體
* 示例結構

## 客戶端請求消息
客戶端發(fā)送一個HTTP請求到服務器的請求消息包括以下格式:請求行(request line)、請求頭部俗稱報頭(header)、空行和請求數據四個部分組成,如下圖所示:

* 請求行:
```
POST /orgid/idtoken/conditional HTTP/1.1
[請求方法] [url] [版本] (空格其分割區(qū)分作用)
```
* 報頭
```
Host :請求的資源在哪個主機的端口上
Connection:該請求支持長連接(heep_alive)
Content-Length:正文內容長度
Content-Type:數據類型
User-Agent:聲明用戶的操作系統和瀏覽器版本信息
Accent:發(fā)起了請求
Referer:當前頁面是從哪個頁面跳轉過來的
Accept-Encoding:接受的編碼
Accept-Language:接受的語言類型
Cookie:用于在客戶端存儲少量信息,通常用于實現會話(session)功能
```
* 空行
它的作用是通過一個空行,告訴服務器請求頭部到此為止。
* 請求數據
注意:若方法字段是GET,則此項為空,沒有數據
若方法字段是POST,則通常來說此處放置的就是要提交的數據
舉例:比如要使用POST方法提交一個表單,其中有user字段中數據為“admin”, password字段為123456,那么這里的請求數據就是 user=admin&password=123456,使用&來連接各個字段。
## 服務器響應消息
HTTP響應也由四個部分組成,分別是:響應行、響應報頭、空行和響應正文。
* 響應行
響應行一般由協議版本、狀態(tài)碼及其描述組成 比如 HTTP/1.1 200 OK
其中協議版本HTTP/1.1或者HTTP/1.0,200就是它的狀態(tài)碼,OK則為它的描述。
* 響應頭
響應頭用于描述服務器的基本信息,以及數據的描述,服務器通過這些數據的描述信息,可以通知客戶端如何處理等一會兒它回送的數據。
**常見的響應頭字段含義:**
```
Allow:服務器支持哪些請求方法(如GET、POST等)。
```
```
Content-Encoding:文檔的編碼(Encode)方法。只有在解碼之后才可以得到Content-Type頭指定的內容類型。
```
```
Content-Length:表示內容長度。只有當瀏覽器使用持久HTTP連接時才需要這個數據。
```
```
Content- Type:表示后面的文檔屬于什么MIME類型。
```
```
Date:當前的GMT時間,例如,Date:Mon,31Dec200104:25:57GMT。
```
```
Expires:告訴瀏覽器把回送的資源緩存多長時間,-1或0則是不緩存。
```
```
Last-Modified:文檔的最后改動時間。客戶可以通過If-Modified-Since請求頭提供一個日期,該請求將被視為一個條件GET,只有改動時間遲于指定時間的文檔才會返回,否則返回一個304(Not Modified)狀態(tài)。Last-Modified也可用setDateHeader方法來設置。
```
```
Location:這個頭配合302狀態(tài)碼使用,用于重定向接收者到一個新URI地址。表示客戶應當到哪里去提取文檔。
```
```
Refresh:告訴瀏覽器隔多久刷新一次,以秒計。
```
```
Server:服務器通過這個頭告訴瀏覽器服務器的類型。Server響應頭包含處理請求的原始服務器的軟件信息。此域能包含多個產品標識和注釋,產品標識一般按照重要性排序。Servlet一般不設置這個值,而是由Web服務器自己設置。
```
```
Set-Cookie:設置和頁面關聯的Cookie。
```
```
Transfer-Encoding:告訴瀏覽器數據的傳送格式。
```
```
WWW-Authenticate:客戶應該在Authorization頭中提供什么類型的授權信息?在包含401(Unauthorized)狀態(tài)行的應答中這個頭是必需的。
```
```
setContentType:設置Content-Type頭。大多數Servlet都要用到這個方法。
```
```
setContentLength:設置Content-Length頭。對于支持持久HTTP連接的瀏覽器來說,這個函數是很有用的。
```
```
addCookie:設置一個Cookie(Servlet API中沒有setCookie方法,因為應答往往包含多個Set-Cookie頭)。
```
```
插入代碼
```
* 空行
它的作用是通過一個空行,告訴響應端響應頭部到此為止。
* 響應體
響應體就是響應的消息體,如果是純數據就是返回純數據,如果請求的是HTML頁面,那么返回的就是HTML代碼,如果是JS就是JS代碼,如此之類。
# 參考資料
* 《HTTP請求/響應報文結構》
* 《HTTP教程》