按照傳輸過程,HTTP 報文分爲請求報文和響應報文。請求報文和響應報文的結構差不多,這裏只對 HTTP 請求報文做一個總結。
HTTP 請求報文由 請求行、請求頭、請求體(請求數據)、空行 四個部分組成(空行不知道算不算報文的一部分)。
一、請求行
請求行有三個組成部分:請求方法、請求 URL、HTTP 協議版本組成。這三個部分佔據一行,每個部分之間用空格隔開。
在HTTP1.0版本中定義了三種請求方法: GET, POST 和 HEAD 方法
之後HTTP1.1版本新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
REST設計風格對應的四種請求類型 GET(獲取數據)、POST(添加數據)、PUT(更新數據)、DELETE(刪除數據) 就在這八種之內
1.GET: 請求指定的頁面信息,並返回實體主體。
2.HEAD: 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
3.POST: 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST 請求可能會導致新的資源的建立和/或已有資源的修改。
4.PUT: 從客戶端向服務器傳送的數據取代指定的資源。
5.DELETE: 請求服務器刪除指定的資源。
6.CONNECT: HTTP/1.1協議中預留給能夠將連接改爲管道方式的代理服務器。
7.OPTIONS: 允許客戶端查看服務器的性能。
8.TRACE: 回顯服務器收到的請求,主要用於測試或診斷。
GET 和 POST 的區別在於 GET 請求數據存儲在請求行中,而 POST 請求數據存儲在請求體(BODY) 中
二、請求頭
請求頭部通知服務器有關於客戶端請求的信息,由關鍵字/值對組成,每行一對。
請求頭有下面幾種常見可選項
Host: 原始的 URL 中的主機和端口
Referer: 所指向的 Web 頁的 URL
Accept: 客戶端可以處理的 MIME 類型
Accept-Language: 客戶端的首選語言(en、en-us等)
Accept-Encoding: 客戶端處理的編碼類型(gzip、compress等)
User-Agent: 客戶端自身信息
Content-Type: POST 數據的 MIME 類型
Content-Length: POST 數據的大小(KB)
Connection:Keep-Alive
三、請求體
POST 方法中發送到服務的表單數據或文件,是一個鍵值對組合。這個與請求頭中 Content-Type 和 Content-Length 密切相關。
HTTP協議規定 POST 提交的數據必須放在消息主體,但協議並沒有規定數據必須使用什麼編碼方式。
我們可以通過<form>表單中 enctype 屬性的值告訴服務器表單編碼類型。常見有如下幾種:
1、application/x-www-form-urlencoded(默認值)
所有字符都會進行編碼(多個鍵值對之間用 "&" 連接,空格轉換爲 "+" 加號,特殊符號轉換爲 ASCII HEX 值)。
例如:
Content-Type: application/x-www-form-urlencoded;charset=utf-8 username=admin&password=admin
2、multipart/form-data
該類型用於高效傳輸文件、非ASCII數據和二進制數據,用指定的分隔符 --boundary 將表單數據逐項分隔。每項數據由幾個部分組成:
Ⅰ、內容描述信息:Content-Disposition、鍵名等
例如:Content-Disposition:form-data;name="username"
例如:Content-Disposition:form-data;name="admin";filename="admin.jpg"
Ⅱ、內容類型(可選):Content-Type,默認值爲 text/plain。
Ⅲ、回車(一個空行):用來分隔數據具體的值和其他信息。
Ⅳ、字段具體內容(文本或二進制)。
例如:
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition:form-data;name="username" Content-Type:text/plain( (這裏爲空行,表示後面是數據) admin(這裏是Value的值) --WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition:form-data;name="admin";filename="admin.jpg"(這後面必須換行) Content-Type:image/jpeg(這後面必須換行) ...二進制..-- --WebKitFormBoundaryrGKCBY7qhFd3TrwA--
3、text/plain
按照鍵值對排列表單數據key1=value1\r\nkey2=value2,不進行轉義。
附錄
HTTP請求報文結構圖:
HTTP請求報文示例:
HTTP響應報文示例: