1. HTTP請求報文格式
HTTP請求報文分為三部分:請求行、請求頭和請求體

注:部分文章也將HTTP請求報文分為兩部分:請求頭和請求體
1.1 請求行
請求行(Request Line)分為三個部分:請求方法、請求地址和協(xié)議及版本,以CRLF(rn)結(jié)束。
HTTP/1.1 定義的請求方法有8種:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的兩種GET和POST,如果是RESTful接口的話一般會用到GET、POST、DELETE、PUT。(GET方法是默認(rèn)的請求方法,用來請求訪問URI所指定的資源,并不對服務(wù)器上的內(nèi)容產(chǎn)生熱喝作用結(jié)果;POST方法用來傳輸實(shí)體主體,目的并不是獲取響應(yīng)的主體內(nèi)容,POST方法是把內(nèi)容放在報文內(nèi)容中,只要報文內(nèi)容沒有限制,它的大小就沒有限制。)
請求地址由四部分組成:protocol[協(xié)議]、host[主機(jī)]、path[路徑]、Query String[參數(shù)],例如:
http[protocol]://localhost[host]/index.html[path]?key1=value1&key2=value2[Query String]
1.2 請求頭 Request Headers
請求頭可用于傳遞一些附加信息,格式: 鍵: 值,注意冒號后面有一個空格!例如:
Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
詳見3. Header
1.3 請求體
請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經(jīng)結(jié)束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字符串信息:
username=Bill&password=KillBill
在以上的例子的HTTP請求中,請求的正文只有一行內(nèi)容。當(dāng)然,在實(shí)際應(yīng)用中,HTTP請求正文可以包含更多的內(nèi)容。
根據(jù)應(yīng)用場景的不同,HTTP請求的請求體有三種不同的形式:
第一種:移動開發(fā)者常見的,請求體是任意類型,服務(wù)器不會解析請求體,請求體的處理需要自己解析,如Post Json時候。

第二種:第二種和第三種都有固定格式的,屬于形式二,是服務(wù)器端開發(fā)人員最先了解到的兩種。這里的格式要求就是URL中Query String的格式要求:多個鍵值對之間用&連接,鍵與值之前用=連接,且只能用ASCII字符,非ASCII字符需使用UrlEncode編碼。

第三種:第三種請求體的請求體被分成為多個部分,文件上傳時會被使用,這種格式最先應(yīng)該是被用于郵件傳輸中,每個字段/文件都被boundary(Content-Type中指定)分成單獨(dú)的段,每段以-- 加 boundary開頭,然后是該段的描述頭,描述頭之后空一行接內(nèi)容,請求結(jié)束的標(biāo)制為boundary后面加--,結(jié)構(gòu)見下圖:

第四種:區(qū)分是否被當(dāng)成文件的關(guān)鍵是Content-Disposition是否包含filename,因為文件有不同的類型,所以還要使用Content-Type指示文件的類型,如果不知道是什么類型取值可以為application/octet-stream表示該文件是個二進(jìn)制文件,如果不是文件則Content-Type可以省略。下圖為一個帶有文件的上傳的請求體原文:

注:第二、三種請求體需求配合特定的Content-Type請求頭,如:第二種配合Content-Type:application/x-www-form-urlencoded;第三種配合Content-Type: multipart/form-data; boundary={boundary} ,*上面的form-data也可以是mixed、alternative、digest、parallel,但我只用到了form-data;如果兩者沒有相配合,那么服務(wù)器不會解析請求體,也就是說只會當(dāng)成第一種情況!表單或者模擬表單 指的就是第二種和第三種(multipart/form-data)
2. HTTP響應(yīng)報文格式
HTTP響應(yīng)報文分為三部分:響應(yīng)行(狀態(tài)行)、響應(yīng)頭、響應(yīng)體

2.1 狀態(tài)行
狀態(tài)行由四部分組成:協(xié)議版本、狀態(tài)碼和狀態(tài)碼描述,以CRLF(rn)結(jié)束。
狀態(tài)碼詳細(xì)可以查看HTTP狀態(tài)碼詳解
2.2 Response Headers和Request Headers相同,見下文
2.3 響應(yīng)體
3. Header
Header可用于傳遞一些附加信息,格式: 鍵: 值,注意冒號后面有一個空格!
3.1 請求和響應(yīng)常見通用Header
Content-Type:請求體/響應(yīng)體的類型,如:text/plain、application/json
Accept:說明接收的類型,可以多個值,用,(半角逗號)分開
Content-Length:請求體/響應(yīng)體的長度,單位字節(jié)
Content-Encoding:請求體/響應(yīng)體的編碼格式,如gzip,deflate
Accept-Encoding:告知對方我方接受的Content-Encoding
ETag:給當(dāng)前資源的標(biāo)識,和Last-Modified、If-None-Match、If-Modified-Since配合,用于緩存控制
Cache-Control:取值為一般為no-cache或max-age=XX,XX為個整數(shù),表示該資源緩存有效期(秒)
3.2 常見請求Header
Authorization:用于設(shè)置身份認(rèn)證信息
User-Agent:用戶標(biāo)識,如:OS和瀏覽器的類型和版本
If-Modified-Since:值為上一次服務(wù)器返回的 Last-Modified 值,用于確認(rèn)某個資源是否被更改過,沒有更改過(304)就從緩存中讀取
If-None-Match:值為上一次服務(wù)器返回的 ETag 值,一般會和If-Modified-Since一起出現(xiàn)
Cookie:已有的Cookie
Referer:表示請求引用自哪個地址,比如你從頁面A跳轉(zhuǎn)到頁面B時,值為頁面A的地址
Host:請求的主機(jī)和端口號
3.3 常見響應(yīng)Header
Date:服務(wù)器的日期
Last-Modified:該資源最后被修改時間
Transfer-Encoding:取值為一般為chunked,出現(xiàn)在Content-Length不能確定的情況下,表示服務(wù)器不知道響應(yīng)版體的數(shù)據(jù)大小,一般同時還會出現(xiàn)Content-Encoding響應(yīng)頭
Set-Cookie:設(shè)置Cookie
Location:重定向到另一個URL,如輸入瀏覽器就輸入baidu.com回車,會自動跳到 https://www.baidu.com ,就是通過這個響應(yīng)頭控制的
Server:后臺服務(wù)器