1.http協(xié)議
http全稱Hypertext Transfer Protocol超文本傳輸協(xié)議旨怠,該協(xié)議用于規(guī)定客戶端和服務(wù)端之間的傳輸規(guī)則盹沈〕笔郏客戶端按照協(xié)議規(guī)則格式向服務(wù)端發(fā)出請(qǐng)求刘陶,服務(wù)端從而也就能夠根據(jù)規(guī)則格式做出解析请契,同理咳榜,服務(wù)端也會(huì)按照協(xié)議規(guī)則做出響應(yīng),客戶端也就能夠根據(jù)規(guī)則做出解析爽锥。
2.http請(qǐng)求(Request)內(nèi)容
如圖所示涌韩,一個(gè)完整的request包含request line、header氯夷、和body臣樱。同時(shí)需要注意的是,圖中的CRLF也是必不可少的。
下面通過charles抓的一個(gè)http請(qǐng)求展開分析 http://www.reibang.com/p/q81RER
GET /p/q81RER HTTP/1.1
Host: www.reibang.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Upgrade-Insecure-Requests: 1
Cookie: _session_id=xxxxx; remember_user_token=xxx; Hm_lpvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1493626002; Hm_lvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1493550585,1493622639,1493623143,1493625980; _ga=GA1.2.487162296.1493344586; _gat=1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
Connection: keep-alive
- 請(qǐng)求行Request Line
// method+空格+URI+httpVersion+CRLF
GET /p/q81RER HTTP/1.1
method 就是我們平時(shí)所說的get雇毫、post等請(qǐng)求方式奢啥。
** URI** 就是URL中排除掉Host剩下的部分,也就是資源在服務(wù)器本地上的路徑
** httpVersion** http版本號(hào)
- 請(qǐng)求頭Request Header
Host: www.reibang.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Upgrade-Insecure-Requests: 1
Cookie: _session_id=xxxxx; remember_user_token=xxx; Hm_lpvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1493626002; Hm_lvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1493550585,1493622639,1493623143,1493625980; _ga=GA1.2.487162296.1493344586; _gat=1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
Connection: keep-alive
請(qǐng)求頭由一些鍵值對(duì)組成嘴拢,每個(gè)鍵值對(duì)的形式為:Key:空格Value+CRLF
,需要強(qiáng)調(diào)的是寂纪,最后一個(gè)鍵值對(duì)結(jié)束后再跟一個(gè)CRLF席吴,就表示header結(jié)束了。
HTTP本身定義了一些header key捞蛋,(需要了解各個(gè)key的含義孝冒,看請(qǐng)求頭響應(yīng)頭參考表)另外也允許開發(fā)者添加自己的key,自定義的key一般以X開頭拟杉,比如可以定義X-APP-VERSION來記錄客戶端的版本號(hào)庄涡。
- 請(qǐng)求體Body
body里面包含請(qǐng)求的實(shí)際數(shù)據(jù)。
Method=GET搬设,body可以不存在穴店,header最后的兩個(gè)CRLF就標(biāo)識(shí)著請(qǐng)求的結(jié)尾。請(qǐng)求的業(yè)務(wù)參數(shù)通過request line中的URI中的query string來傳遞拿穴,如UIR: /p/q81RER?t=aa&t1=bb泣洞,query string部分t=aa&t1=bb體現(xiàn)了業(yè)務(wù)參數(shù),這部分也同樣是以鍵值對(duì)的形式存在的默色。
Method=POST球凰,body體一般不為空,我們實(shí)際的業(yè)務(wù)數(shù)據(jù)都存放于body當(dāng)中腿宰,數(shù)據(jù)在body體中是以何種形式存在呕诉,其實(shí)大有門道,后面再細(xì)說吃度。至于Request-URI當(dāng)中的query string部分甩挫,我們依然可以選擇放置一部分?jǐn)?shù)據(jù)在其中,但更普遍的做法是使用body體规肴。
3.http響應(yīng)(Response)內(nèi)容
如圖所示捶闸,response的結(jié)構(gòu)和request的結(jié)構(gòu)幾乎一樣,只不過是Request Line變成了Status Line拖刃。
下面是一個(gè)完整的response內(nèi)容例子:
HTTP/1.1 200 OK
Date: Mon, 01 May 2017 08:07:01 GMT
Server: Tengine
Content-Type: application/json; charset=utf-8
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
ETag: W/"8736cdfe08480bca66cffeee06268705"
Cache-Control: max-age=0, private, must-revalidate
Set-Cookie: _session_id=xxxxx; path=/; HttpOnly
X-Request-Id: e7a4211c-efde-4e87-9a48-1e6f09de5afd
X-Runtime: 0.038405
Content-Encoding: gzip
X-Via: 1.1 tongyidong11:0 (Cdn Cache Server V2.0)
Transfer-Encoding: chunked
Proxy-Connection: Keep-alive
{"message":"success"}