轉載自:
https://www.jianshu.com/p/0015277c6575
https://www.cnblogs.com/myseries/p/11239662.html
1. 請求報文
HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求數據4個部分組成。
(1)請求行:
請求方法
請求行中包括請求方法(GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT),其中最常用的為GET、POST。
GET:表示獲取,不適合用來傳遞私密數據,也不適合拿來傳遞大量數據。其參數在url中,而特定瀏覽器和服務器對url的長度是有限制的,所以傳遞參數長度受限制。安全且冪等。
POST:表示投遞(創建)資源,資源在請求體中出現,通常以名稱/值的形式(常用json),可以傳輸大量數據,對數據量沒有限制,也不會顯示在URL中。不安全且不冪等。
PUT:將資源放在指定的位置上,與post相似,不同的是,put指定資源存放的位置。不安全且冪等。
DELETE:刪除資源。不安全但冪等。
HEAD:HEAD跟GET相似,不過服務端接收到HEAD請求時只返回響應頭,不發送響應內容。所以,如果只需要查看某個頁面的狀態時,用HEAD更高效,因為省去了傳輸頁面內容的時間。
OPTIONS:用於獲取當前URL所支持的方法。若請求成功,會在HTTP頭中包含一個名為“Allow”的頭,值是所支持的方法,如“GET, POST”。
TRACE:回顯服務器收到的請求,主要用於測試或診斷。
CONNECT:是HTTP/1.1協議預留的,能夠將連接改為管道方式的代理服務器。通常用於SSL加密服務器的鏈接與非加密的HTTP代理服務器的通信。
HTTP版本
HTTP/1.0:HTTP/1.0支持:GET、POST、HEAD三種HTTP請求方法。
HTTP/1.1:HTTP/1.1是當前正在使用的版本。該版本默認采用持久連接,並能很好地配合代理服務器工作。還支持以管道方式同時發送多個請求,以便降低線路負載,提高傳輸速度。HTTP/1.1新增了:OPTIONS、PUT、DELETE、TRACE、CONNECT五種HTTP請求方法。
(2)請求頭:
請求頭部由關鍵字/值對組成,每行一對
- User-Agent : 產生請求的瀏覽器類型
- Accept : 客戶端希望接受的數據類型,比如 Accept:text/xml(application/json)表示希望接受到的是xml(json)類型
- Content-Type:發送端發送的實體數據的數據類型。比如,Content-Type:text/html(application/json)表示發送的是html類型。
- Host : 請求的主機名,允許多個域名同處一個IP地址,即虛擬主機
常見的Content-Type:
Content-Type | 解釋 |
---|---|
text/html | html格式 |
text/plain | 純文本格式 |
text/css | CSS格式 |
text/javascript | js格式 |
image/gif | gif圖片格式 |
image/jpeg | jpg圖片格式 |
image/png | png圖片格式 |
application/x-www-form-urlencoded | POST專用:普通的表單提交默認是通過這種方式。form表單數據被編碼為key/value格式發送到服務器。 |
application/json | POST專用:用來告訴服務端消息主體是序列化后的 JSON 字符串 |
text/xml | POST專用:發送xml數據 |
multipart/form-data | POST專用:下面講解 |
multipart/form-data:
用以支持向服務器發送二進制數據,以便可以在 POST 請求中實現文件上傳等功能。
Content-Disposition(內容部署)
(1)作為主體的響應標題
為用於下載文件時的字段,有兩種部署類型:inline和attachment。
inline :將文件內容直接顯示在頁面。
attachment:彈出對話框讓用戶下載。
(2)作為多部分主體的 header
HTTP 上下文中的第一個參數總是form-data
; 其他參數不區分大小寫,並且有參數,在'='
符號后面使用帶引號的字符串語法。多個參數用分號(';'
)分隔。
Content-Disposition: form-data Content-Disposition: form-data; name="fieldName" Content-Disposition: form-data; name="fieldName"; filename="filename.jpg"
name后面跟着一個字符串,其中包含該字段的內容引用的 HTML 字段的名稱。
filename后面是一個包含傳輸文件的原始名稱的字符串。文件名始終是可選的,不能被應用程序盲目使用:路徑信息應該被刪除,並且應該轉換為服務器文件系統規則。該參數提供大部分指示性信息。
例:用Postman向百度發送一個請求方式為multipart/form-data
的POST包,請求報文是這樣的:
POST / HTTP/1.1 Host: www.baidu.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW Cache-Control: no-cache Postman-Token: 033120fe-2185-15d4-e486-75e86e2baddd ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="url" https://www.baidu.com/ ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="name" waffle ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="desk"; filename="桌子.jpg" Content-Type: image/jpeg ...contents of 桌子.jpg... ------WebKitFormBoundary7MA4YWxkTrZu0gW--
其中, boundary這個參數是分界線的意思,這個分界線參數具體是什么你可以隨意自定義 ,建議定義復雜一點,因為這樣子才不會跟請求體中其它字段重復。
上面的例子看出分界線=“--”+boundary
每個參數都由分界線分隔開,參數名(二進制數據還需要指明文件類型)和參數值之間有一行空行,這個空行不能省略:
------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="url" https://www.baidu.com/
消息主體最后以 --boundary-- 標示結束。
(3)空行
請求頭之后是一個空行,通知服務器以下不再有請求頭
(4)請求體
GET沒有請求數據,POST有。
與請求數據相關的最常使用的請求頭是 Content-Type 和 Content-Length 。
一個簡單的請求報文
POST /user HTTP/1.1 //請求行 Host: www.user.com Content-Type: application/x-www-form-urlencoded Connection: Keep-Alive User-agent: Mozilla/5.0. //以上是首部行 (此處必須有一空行) //空行分割header和請求內容 name=world 請求體
2、響應報文
HTTP響應報文和請求報文的結構類似,也是由四個部分組成:狀態行、消息報頭、空行、響應體。
(1)狀態行
狀態行也由三部分組成:服務器HTTP協議版本,響應狀態碼,狀態碼的文本描述
格式:HTTP-Version Status-Code Reason-Phrase CRLF
比如:HTTP/1.1 200 OK
狀態碼:由3位數字組成,第一個數字定義了響應的類別。
1xx:指示信息,表示請求已接收,繼續處理。
2xx:成功,表示請求已被成功接受,處理。
3xx:重定向。
4xx:客戶端錯誤。
5xx:服務器端錯誤,服務器未能實現合法的請求。