作為一個開發(fā)人員,掌握必要的 HTTP 協(xié)議十分重要,下面就通過本文記錄自己對 HTTP 協(xié)議的理解。
HTTP 基本概念
HTTP,全稱為 HyperText Transfer Protocol,即為超文本傳輸協(xié)議。是互聯(lián)網(wǎng)應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,所有的 www 文件都必須遵守這個標(biāo)準(zhǔn)。
它是一種建立在TCP/IP上的無狀態(tài)連接,默認(rèn)端口為80。整個基本的工作流程是客戶端發(fā)送一個HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務(wù)端收到請求之后,服務(wù)端開始處理請求,并根據(jù)請求做出相應(yīng)的動作訪問服務(wù)器資源,最后通過發(fā)送HTTP響應(yīng)把結(jié)果返回給客戶端。其中一個請求的開始到一個響應(yīng)的結(jié)束稱為事務(wù),當(dāng)一個事物結(jié)束后還會在服務(wù)端添加一條日志條目。
HTTP可分為兩個部分:請求和響應(yīng)
1.HTTP請求
HTTP請求是客戶端往服務(wù)端發(fā)送請求動作,告知服務(wù)器自己的要求。
HTTP請求由狀態(tài)行、請求頭、請求正文三部分組成:
- 狀態(tài)行:包括請求方式Method、資源路徑URL、協(xié)議版本Version;
- 請求頭:包括一些訪問的域名、用戶代理、Cookie等信息;
- 請求正文:就是HTTP請求的數(shù)據(jù)。
HTTP請求報文:

報文實例:

1.請求報文的起始由請求行構(gòu)成(有些資料稱為狀態(tài)行,名字不一樣而已,都是指的一個東西),用來說明該請求想要做什么,由<Method>、<URL>、<Version> 三個字段組成,注意每個字段之間都有一個空格。
其中<Method>字段有不同的值:
- GET --- 訪問服務(wù)器的資源
- POST --- 向服務(wù)器發(fā)送要修改的數(shù)據(jù)
- HEAD --- 獲取服務(wù)器文檔的首部
- PUT --- 向服務(wù)器上傳資源
- DELETE--- 刪除服務(wù)器的資源
<URL>字段表示服務(wù)器的資源目錄定位
<Version>字段表示使用的http協(xié)議版本
2.首部部分由多個請求頭(也叫首部行)構(gòu)成,那些首部字段名有如下,不全:
- Accept 指定客戶端能夠接收的內(nèi)容格式類型
- Accept-Language 指定客戶端能夠接受的語言類型
- Accept-Ecoding 指定客戶端能夠接受的編碼類型
- User-Agent 用戶代理,向服務(wù)器說明自己的操作系統(tǒng)、瀏覽器等信息
- Connection 是否開啟持久連接(keepalive)
- Host 服務(wù)器域名
- ...
3.主體部分就是報文的具體數(shù)據(jù)。
附 get方法和post方法的區(qū)別
1.GET 一般用于信息獲取,比如剛才我們?yōu)g覽百度首頁,其使用的就是GET方法。GET 請求一般不會產(chǎn)生副作用,它僅僅只是獲取資源信息,就像數(shù)據(jù)庫查詢一樣,不會修改、增加數(shù)據(jù),不會影響資源的狀態(tài),并且對同一個 URL 的多次GET請求應(yīng)該返回相同的結(jié)果。
而 POST 請求表示可能會修改服務(wù)器上的資源。
2.GET 和 POST 請求參數(shù)位置不同,GET 請求對應(yīng)的參數(shù)放在 URL 中,而 POST 請求對應(yīng)的參數(shù)放在 HTTP 請求主體中。(但是這只是一種約定,GET 請求中出現(xiàn) Body 也是被允許的)
3.GET 請求的參數(shù)在 URL 中,因此絕不能用 GET 請求傳輸敏感數(shù)據(jù)。POST 請求數(shù)據(jù)則寫在 HTTP 的請求頭中,安全性略高于 GET 請求。處于安全考慮,在一些涉及安全的請求比如:登錄請求需要用 POST 提交表單,而GET 請求一般用來獲取靜態(tài)資源。
可用Chrome開發(fā)者工具來對HTTP請求進行查看

2.HTTP響應(yīng)
HTTP 響應(yīng)是服務(wù)器在客戶端發(fā)送 HTTP 請求后經(jīng)過一些處理而做出的響應(yīng),HTTP 響應(yīng)和 HTTP 請求相似,也是由三個部分構(gòu)成。分別是:狀態(tài)行,響應(yīng)頭(Response Header),響應(yīng)正文。
HTTP響應(yīng)報文:

報文實例:

1.響應(yīng)報文的起始由狀態(tài)行構(gòu)成,用來說明服務(wù)器做了什么,由<Version>、<Status-Code>、<Phrase>三個字段組成,同樣的每個字段之間留有空格;
狀態(tài)行中包含一個狀態(tài)碼,用來表示服務(wù)器對客戶端響應(yīng)的結(jié)果。
狀態(tài)碼一般由3位構(gòu)成:
1xx : 表示請求已經(jīng)接受了,繼續(xù)處理。
2xx : 表示請求已經(jīng)處理掉了。
3xx : 重定向。
4xx : 一般表示客戶端有錯誤,請求無法實現(xiàn)。
5xx : 一般為服務(wù)器端的錯誤。
比如常見的狀態(tài)碼:
200 OK 客戶端請求成功。
301 Moved Permanently 請求永久重定向。
302 Moved Temporarily 請求臨時重定向。
304 Not Modified 文件未修改,可以直接使用緩存的文件。
400 Bad Request 由于客戶端請求有語法錯誤,不能被服務(wù)器所理解。
401 Unauthorized 請求未經(jīng)授權(quán),無法訪問。
403 Forbidden 服務(wù)器收到請求,但是拒絕提供服務(wù)。服務(wù)器通常會在響應(yīng)正文中給出不提供服務(wù)的原因。
404 Not Found 請求的資源不存在,比如輸入了錯誤的URL。
500 Internal Server Error 服務(wù)器發(fā)生不可預(yù)期的錯誤,導(dǎo)致無法完成客戶端的請求。
503 Service Unavailable 服務(wù)器當(dāng)前不能夠處理客戶端的請求,在一段時間之后,服務(wù)器可能會恢復(fù)正常。
2.首部由多個響應(yīng)頭(也叫首部行)組成, 首部字段名如下,不全:
- Server 服務(wù)器軟件名,Apache/Nginx
- Date 服務(wù)器發(fā)出響應(yīng)報文的時間
- Last-Modified 請求資源的最后的修改時間
- ...
4.主體部分是響應(yīng)報文的具體數(shù)據(jù)。
可用Chrome開發(fā)者工具來對HTTP響應(yīng)進行查看

知道了 HTTP 請求和響應(yīng)后,一個完整的流程一般是這樣的:
通常,由 HTTP 客戶端發(fā)起一個請求,建立一個到服務(wù)器指定端口(默認(rèn)是 80 端口)的 TCP 連接。HTTP 服務(wù)器則在那個端口監(jiān)聽客戶端發(fā)送過來的請求。一旦收到請求,服務(wù)器(向客戶端)發(fā)回一個狀態(tài)行,比如"HTTP/1.1 200 OK",和(響應(yīng)的)消息,消息的消息體可能是請求的文件、錯誤消息、或者其它一些信息。
附
用 curl 創(chuàng)造一個請求,并得到響應(yīng)
例如:curl -s -v -H "Frank: xxx" -- "https://www.baidu.com"
