1 、http協(xié)議用于客戶端和服務(wù)端的通信

在應(yīng)用HTTP協(xié)議的時(shí),必定有一端擔(dān)任客戶端角色,另一端擔(dān)任服務(wù)端角色

請(qǐng)求(request)必定是由客戶端發(fā)出,而服務(wù)器端回復(fù)響應(yīng)(respone)
2、http是無(wú)狀態(tài)協(xié)議
首先我們需要理解下這里的無(wú)狀態(tài)的含義是:http是一種不保存狀態(tài),即http協(xié)議自身不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存,啦啦,還是看圖吧

HTTP協(xié)議自身不具備保存之前發(fā)送過(guò)的請(qǐng)求或響應(yīng)的功能
當(dāng)我們使用http協(xié)議的時(shí)候,每次有新的請(qǐng)求發(fā)送,就會(huì)有對(duì)應(yīng)新的響應(yīng)產(chǎn)生。協(xié)議本身并不保留之前一切的請(qǐng)求或者響應(yīng)的報(bào)文信息。這是為了更快的處理大量事務(wù),確保了協(xié)議的可伸展性,而將http協(xié)議設(shè)計(jì)的這樣的簡(jiǎn)單
3、請(qǐng)求URI定位資源
其實(shí)這里將URI理解為URL我覺(jué)得也是可以的,因?yàn)椴┛偷膶?xiě)作主要參考《圖解HTTP》這本書(shū),為了保持一致性,我還是使用URI來(lái)定位資源,關(guān)于URL和URI的區(qū)別,建議可以參考下知乎上的這個(gè)問(wèn)答:https://www.zhihu.com/question/21950864

HTTP協(xié)議使用URI讓客戶端定位到資源
以請(qǐng)求http://hackr.com/index.html作為請(qǐng)求的例子
GET /index.html HTTP/1.1
Host: hackr.com
這里GET是請(qǐng)求方法,host是請(qǐng)求的主機(jī)名(服務(wù)器),index.html是對(duì)應(yīng)主機(jī)上的資源,HTTP/1.1是協(xié)議
4、告知服務(wù)器意圖的HTTP方法
下面的表列舉了HTTP/1.0和HTTP/1.1的方法

目前大多數(shù)WEB應(yīng)用都是采用的HTTP/1.1中可使用的方法 下面會(huì)重點(diǎn)介紹一下HTTP/1.1中的7個(gè)基本請(qǐng)求方法
GET: 獲取資源

- 請(qǐng)求
GET /index.html HTTP/1.1
Host: www.hacker.com
- 響應(yīng): 返回index.html的頁(yè)面資源
POST: 傳輸實(shí)體主體
POST方法主要用來(lái)傳輸實(shí)體主體,GET方法也可以用來(lái)傳輸實(shí)體的主體,但一般不采用;雖然POST方法和GET方法功能很相似,但POST主要目的也不是用來(lái)獲取響應(yīng)的主體內(nèi)容。

- 請(qǐng)求
POST /submit.cgi HTTP/1.1
Host: www.hacker.com
Content-Length: 1560(1560字節(jié)數(shù)據(jù))
- 響應(yīng): 返回submit.cgi接受數(shù)據(jù)的處理結(jié)果
PUT: 傳輸文件
PUT方法用來(lái)傳輸文件,要求在請(qǐng)求報(bào)文的主體中包含文件內(nèi)容,然后保存到請(qǐng)求URI指定的位置。

- 請(qǐng)求
PUT /example.html HTTP/1.1
Host: www.hacker.com
Content-Type: text/html
Content-Length: 1560 (1560字節(jié)的數(shù)據(jù))
- 響應(yīng):響應(yīng)是請(qǐng)求執(zhí)行成功了,但無(wú)數(shù)據(jù)返回;響應(yīng)返回狀態(tài)碼204 No Content
HEAD: 獲取報(bào)文首部
HEAD方法和GET方法一樣,只是不返回報(bào)文主體部分。 用于確認(rèn)URI的有效性及資源更新的日期時(shí)間

GET一樣,但不返回報(bào)文主體
- 請(qǐng)求
HEAD /index.html HTTP/1.1
Host: www.hacker.com
- 響應(yīng):返回index.html有關(guān)的響應(yīng)首部
DELETE: 刪除文件

- 請(qǐng)求
DELETE /example.html HTTP/1.1
Host: www.hacker.com
- 響應(yīng):響應(yīng)返回狀態(tài)碼204(該html已從該服務(wù)器上刪除)
OPTIONS: 詢問(wèn)支持的方法

OPTIONS方法用來(lái)查詢針對(duì)請(qǐng)求URI指定的資源支持的方法
- 請(qǐng)求
OPTIONS * HTTP/1.1
Host: www.hacker.com
- 響應(yīng)
HTTP/1.1 200 OK
Allow: GET, POST, HEAD,OPTIONS
(返回服務(wù)器支持的方法)
TRACE: 追蹤路徑(用的很少)
trace方法是讓W(xué)eb服務(wù)器端之前的請(qǐng)求通信返回給客戶端的方法.

- 請(qǐng)求:
TRACE /HTTP/1.1
Host: hacker.com
Max-Forwards: 2
- 響應(yīng):
HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 1024
TRACE /HTTP/1.1
Host: hacker.com
Max-Forwards: 2 (返回的響應(yīng)包含請(qǐng)求內(nèi)容)
發(fā)送請(qǐng)求時(shí),在Max-Forwards首部字段中填入數(shù)值,每次經(jīng)過(guò)一個(gè)服務(wù)器端就將該數(shù)字減1,當(dāng)數(shù)值剛好減到0時(shí),就停止繼續(xù)傳輸; 最后接受到請(qǐng)求的服務(wù)器端則返回狀態(tài)碼200 OK的響應(yīng)
CONNECT:要求用隧道協(xié)議連接代理
CONNECT方法要求與代理服務(wù)器通信時(shí)建立隧道,實(shí)現(xiàn)用隧道協(xié)議進(jìn)行TCP通信。

CONNECT方法格式
CONNECT 代理服務(wù)器名:端口號(hào) HTTP版本
- 請(qǐng)求
CONNECT proxy.hacker.com:8080 HTTP/1.1
Host: proxy.hacker.com
- 響應(yīng)
HTTP/1.1 200 OK(之后進(jìn)入網(wǎng)絡(luò)隧道)
5、 總結(jié)
上面主要寫(xiě)了一個(gè)簡(jiǎn)單的HTTP協(xié)議的進(jìn)行分析,重點(diǎn)列舉了客戶端向服務(wù)端發(fā)起請(qǐng)求的方法(以HTTP/1.1版本為主),下篇將重點(diǎn)寫(xiě)HTTP狀態(tài)碼。