HTTP協(xié)議簡介
- HyperText Transfer Protocol,超文本傳輸協(xié)議;
- 基于 TCP 的應(yīng)用層協(xié)議;
- 客戶端發(fā)起請求,服務(wù)器響應(yīng)請求。
- 版本
- HTTP/ 0.9 ,最早于 1991 年發(fā)布,目前已不再用;
- HTTP/1.0, 1996 年發(fā)布,引入了多種功能,至今仍在使用當(dāng)中。
- HTTP/1.1,1997 年 發(fā)布,持久連接被默認(rèn)采用,目前最流行的版本。
- HTTP/2 ,2015 年 發(fā)布,引入了服務(wù)器推送等多種功能,目前最新的版本。
HTTP 請求
HTTP 請求由三部分組成:
請求行:包含請求方法、請求地址和 HTTP 協(xié)議版本
消息報頭:包含一系列的鍵值對
請求正文(可選):注意和消息報頭之間有一個空行

舉例: HTTP GET 請求
GET / HTTP/1.1
Host: httpbin.org
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4
Cookie: _ga=GA1.2.475070272.1480418329; _gat=1
上面的第一行:請求行
GET 是請求方法,表示從服務(wù)器獲取資源;/ 是一個請求地址;HTTP/1.1 表明版本是 1.1。
請求行后面的一系列鍵值對就是消息報頭。
其中:
Host 是請求報頭域,用于指定被請求資源的 Internet 主機和端口號,它通常從 HTTP URL 中提取出來;
Connection 表示連接狀態(tài),keep-alive 表示該連接是持久連接(persistent connection),即 TCP 連接默認(rèn)不關(guān)閉,可以被多個請求復(fù)用,如果客戶端和服務(wù)器發(fā)現(xiàn)對方有一段時間沒有活動,就可以主動關(guān)閉連接;
Cache-Control 用于指定緩存指令,它的值有 no-cache, no-store, max-age 等,max-age=秒表示資源在本地緩存多少秒;
User-Agent 用于標(biāo)識請求者的一些信息,比如瀏覽器類型和版本,操作系統(tǒng)等;
Accept 用于指定客戶端希望接受哪些類型的信息,比如 text/html, image/gif 等;
Accept-Encoding 用于指定可接受的內(nèi)容編碼;
Accept-Language 用于指定可接受的自然語言;
Cookie 用于維護(hù)狀態(tài),可做用戶認(rèn)證,服務(wù)器檢驗等,它是瀏覽器儲存在用戶電腦上的文本片段;
HTTP 請求方法
HTTP 通過不同的請求方法以多種方式來操作指定的資源,常用的請求方法如下表:
| 方法 | 描述 |
|---|---|
| GET | 從服務(wù)器獲取指定(請求地址)的資源的信息,它通常只用于讀取數(shù)據(jù),就像數(shù)據(jù)庫查詢一樣,不會對資源進(jìn)行修改。 |
| POST | 向指定資源提交數(shù)據(jù)(比如提交表單,上傳文件),請求服務(wù)器進(jìn)行處理。數(shù)據(jù)被包含在請求正文中,這個請求可能會創(chuàng)建新的資源或更新現(xiàn)有的資源。 |
| PUT | 通過指定資源的唯一標(biāo)識(在服務(wù)器上的具體存放位置),請求服務(wù)器創(chuàng)建或更新資源。 |
| DELETE | 請求服務(wù)器刪除指定資源。 |
| HEAD | 與 GET 方法類似,從服務(wù)器獲取資源信息,和 GET 方法不同的是,HEAD 不含有呈現(xiàn)數(shù)據(jù),僅僅是 HTTP 頭信息。HEAD 的好處在于,使用這個方法可以在不必傳輸全部內(nèi)容的情況下,就可以獲得資源的元信息(或元數(shù)據(jù))。 |
| OPTIONS | 該方法可使服務(wù)器傳回資源所支持的所有 HTTP 請求方法。 |
HTTP 響應(yīng)
HTTP 響應(yīng)與 HTTP 請求相似,由三部分組成:
- 狀態(tài)行:包含 HTTP 協(xié)議版本、狀態(tài)碼和狀態(tài)描述,以空格分隔
- 響應(yīng)頭:即消息報頭,包含一系列的鍵值對
- 響應(yīng)正文:返回內(nèi)容,注意和響應(yīng)頭之間有一個空行

下面是一個 HTTP GET 請求的響應(yīng)結(jié)果:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 29 Nov 2016 13:08:38 GMT
Content-Type: application/json
Content-Length: 203
Connection: close
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {},
"headers": {
"Host": "httpbin.org",
"User-Agent": "Paw/2.3.1 (Macintosh; OS X/10.11.3) GCDHTTPRequest"
},
"origin": "13.75.42.240",
"url": "https://httpbin.org/get"
}
上面的第一行就是一個狀態(tài)行:
其中,200 是狀態(tài)碼,表示客戶端請求成功,OK 是相應(yīng)的狀態(tài)描述。
狀態(tài)碼是一個三位的數(shù)字,常見的狀態(tài)碼有以下幾類:
1XX 消息 -- 請求已被服務(wù)接收,繼續(xù)處理
2XX 成功 -- 請求已成功被服務(wù)器接收、理解、并接受
200 OK
201 Created 已創(chuàng)建
202 Accepted 接收
203 Non-Authoritative Information 非認(rèn)證信息
204 No Content 無內(nèi)容
3XX 重定向 -- 需要后續(xù)操作才能完成這一請求
301 Moved Permanently 請求永久重定向
302 Moved Temporarily 請求臨時重定向
304 Not Modified 文件未修改,可以直接使用緩存的文件
305 Use Proxy 使用代理
4XX 請求錯誤 -- 請求含有詞法錯誤或者無法被執(zhí)行
400 Bad Request 由于客戶端請求有語法錯誤,不能被服務(wù)器所理解
401 Unauthorized 請求未經(jīng)授權(quán)。這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden 服務(wù)器收到請求,但是拒絕提供服務(wù)。服務(wù)器通常會在響應(yīng)正文中給出不提供服務(wù)的原因
404 Not Found 請求的資源不存在,例如,輸入了錯誤的URL
5XX 服務(wù)器錯誤 -- 服務(wù)器在處理某個正確請求時發(fā)生錯誤
500 Internal Server Error 服務(wù)器發(fā)生不可預(yù)期的錯誤,導(dǎo)致無法完成客戶端的請求
503 Service Unavailable 服務(wù)器當(dāng)前不能夠處理客戶端的請求,在一段時間之后,服務(wù)器可能會恢復(fù)正常
504 Gateway Time-out 網(wǎng)關(guān)超時
狀態(tài)行后面的一系列鍵值對就是消息報頭,即響應(yīng)頭:
其中:
Server 包含了服務(wù)器用來處理請求的軟件信息,跟請求報頭域 User-Agent 相對應(yīng);
Content-Type 用于指定發(fā)送給接收者(比如瀏覽器)的響應(yīng)正文的媒體類型,比如 text/html, text/css, image/png, image/jpeg, video/mp4, application/pdf, application/json 等;
Content-Length 指明本次回應(yīng)的數(shù)據(jù)長度;
GET 和 POST
表單提交的兩種方式(method)get和post。

說明:
- get方式提交表單,參數(shù)會出現(xiàn)在URL中,而post不會
- 瀏覽器對URL長度有限制,get提交數(shù)據(jù)時URL長度不能太長(2kB),而post提交理論上沒有限制,攜帶的數(shù)據(jù)量比get多
- get提交是以明文方式直接出現(xiàn)在URL中,不適合機密數(shù)據(jù)傳遞(如密碼),post則更安全。
- get請求有利于保存URL,可以再次訪問及傳播,post則不具有。
參考資料