1. HTTP請求報(bào)文格式
HTTP請求報(bào)文分為三部分:請求行碍现、請求頭和請求體
注:部分文章也將HTTP請求報(bào)文分為兩部分:請求頭和請求體
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)容放在報(bào)文內(nèi)容中囚玫,只要報(bào)文內(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欲侮,因?yàn)槲募胁煌念愋驼赶校赃€要使用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)報(bào)文格式
HTTP響應(yīng)報(bào)文分為三部分:響應(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ù)器