Http協(xié)議請(qǐng)求報(bào)文組成
HTTP請(qǐng)求報(bào)文由3部分組成(請(qǐng)求行+請(qǐng)求頭+請(qǐng)求體):

下面是一個(gè)實(shí)際的請(qǐng)求報(bào)文:

請(qǐng)求頭字段解析
以這個(gè)報(bào)文為例:
POST /app/game/game_list/ HTTP/1.1
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
Host: zhushou.72g.com
Connection: Keep-Alive
Accept-Encoding: gzip
platform=2
1.Post:代表請(qǐng)求寫協(xié)議,一般是get或post,區(qū)別:
- GET使用URL或Cookie傳參。而POST將數(shù)據(jù)放在BODY中。
- GET的URL會(huì)有長(zhǎng)度上的限制,則POST的數(shù)據(jù)則可以非常大。
- POST比GET安全,因?yàn)閿?shù)據(jù)在地址欄上不可見。
/app/game/game_list/ HTTP/1.1:/app/game/game_list/ 是url中除服務(wù)器地址外的path,HTTP/1.1:使用的http協(xié)議版本
- Content-Length:body中內(nèi)容的長(zhǎng)度
3.Content-Type:body中內(nèi)容的類型,默認(rèn)為application/x-www-form-urlencoded,使用url編碼的表單數(shù)據(jù)類型,還可以指定內(nèi)容的編碼:Content-Type: application/x-www-form-urlencoded;charset=utf-8
其他常見類型:
- multipart/form-data
這又是一個(gè)常見的 POST 數(shù)據(jù)提交的方式。我們使用表單上傳文件時(shí),必須讓 form 的 enctyped 等于這個(gè)值。直接來看一個(gè)請(qǐng)求示例(一個(gè)請(qǐng)求發(fā)送了兩段不一樣的數(shù)據(jù),一個(gè)是文本,一個(gè)是png圖片):
POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
這個(gè)例子稍微復(fù)雜點(diǎn)。首先生成了一個(gè) boundary 用于分割不同的字段,為了避免與正文內(nèi)容重復(fù),boundary 很長(zhǎng)很復(fù)雜。然后 Content-Type 里指明了數(shù)據(jù)是以 mutipart/form-data 來編碼,本次請(qǐng)求的 boundary 是什么內(nèi)容。消息主體里按照字段個(gè)數(shù)又分為多個(gè)結(jié)構(gòu)類似的部分,每部分都是以 --boundary 開始,緊接著內(nèi)容描述信息,然后是回車,最后是字段具體內(nèi)容(文本或二進(jìn)制)。如果傳輸?shù)氖俏募?,還要包含文件名和文件類型信息。消息主體最后以 --boundary-- 標(biāo)示結(jié)束。
這種方式一般用來上傳文件,各大服務(wù)端語言對(duì)它也有著良好的支持。
上面提到的這兩種 POST 數(shù)據(jù)的方式,都是瀏覽器原生支持的,而且現(xiàn)階段原生 form 表單也只支持這兩種方式。
- application/json
application/json 這個(gè) Content-Type 作為響應(yīng)頭大家肯定不陌生。實(shí)際上,現(xiàn)在越來越多的人把它作為請(qǐng)求頭,用來告訴服務(wù)端消息主體是序列化后的 JSON 字符串。
可以使用這種方式直接提交json請(qǐng)求,也可以把 JSON 字符串作為 val,仍然放在鍵值對(duì)里,以 x-www-form-urlencoded 方式提交
以下報(bào)文直接提交了json請(qǐng)求:
POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
- text/xml:
POST http://www.example.com HTTP/1.1
Content-Type: text/xml
<!--?xml version="1.0"?-->
<methodcall>
<methodname>examples.getStateName</methodname>
<params>
<param>
<value><i4>41</i4></value>
</params>
</methodcall>
- Host: zhushou.72g.com:服務(wù)器地址
- Connection: Keep-Alive :客戶端和服務(wù)器保持長(zhǎng)時(shí)間鏈接
- Accept-Encoding: gzip:接收的響應(yīng)數(shù)據(jù),編碼格式應(yīng)該為gzip
HTTP的響應(yīng)報(bào)文結(jié)構(gòu)
HTTP的響應(yīng)報(bào)文也由三部分組成(響應(yīng)行+響應(yīng)頭+響應(yīng)體)
以下是一個(gè)實(shí)際的HTTP響應(yīng)報(bào)文:

①報(bào)文協(xié)議及版本;
②狀態(tài)碼及狀態(tài)描述;
③響應(yīng)報(bào)文頭,也是由多個(gè)屬性組成;
④響應(yīng)報(bào)文體,即我們真正要的“干貨”。
響應(yīng)報(bào)文字段解析:
- 響應(yīng)狀態(tài)碼
HTTP的響應(yīng)狀態(tài)碼由5段組成:
- 1xx 消息,一般是告訴客戶端,請(qǐng)求已經(jīng)收到了,正在處理,別急...
- 2xx 處理成功,一般表示:請(qǐng)求收悉、我明白你要的、請(qǐng)求已受理、已經(jīng)處理完成等信息.
- 3xx 重定向到其它地方。它讓客戶端再發(fā)起一個(gè)請(qǐng)求以完成整個(gè)處理。
- 4xx 處理發(fā)生錯(cuò)誤,責(zé)任在客戶端,如客戶端的請(qǐng)求一個(gè)不存在的資源,客戶端未被授權(quán),禁止訪問等。
- 5xx 處理發(fā)生錯(cuò)誤,責(zé)任在服務(wù)端,如服務(wù)端拋出異常,路由出錯(cuò),HTTP版本不支持等
- Content-Type:響應(yīng)報(bào)文的類型
- Content-Encoding:響應(yīng)報(bào)文的編碼