HTTP基本概念
- HTTP是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫。
- HTTP是一個(gè)應(yīng)用層協(xié)議剃诅,由請求和響應(yīng)構(gòu)成,是一個(gè)標(biāo)準(zhǔn)的客戶端服務(wù)器模型。
- HTTP是一個(gè)無狀態(tài)的協(xié)議粱年。
在TCP/IP協(xié)議棧中的位置
HTTP協(xié)議通常承載于TCP協(xié)議之上,有時(shí)也承載于TLS或SSL協(xié)議層之上罚拟,這個(gè)時(shí)候台诗,就成了我們常說的HTTPS完箩。如下圖所示:
默認(rèn)HTTP的端口號為80,HTTPS的端口號為443拉队。
HTTP的請求響應(yīng)模型
HTTP協(xié)議永遠(yuǎn)都是客戶端發(fā)起請求弊知,服務(wù)器回送響應(yīng)。見下圖:
這樣就限制了使用HTTP協(xié)議粱快,無法實(shí)現(xiàn)在客戶端沒有發(fā)起請求的時(shí)候秩彤,服務(wù)器將消息推送給客戶端。HTML5定義了WebSocket協(xié)議皆尔,它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信(full-duplex)呐舔,可以借助它實(shí)現(xiàn)服務(wù)器向客戶端推送消息。
HTTP工作流程
一次HTTP操作稱為一個(gè)事務(wù)慷蠕,其工作過程可分為四步:
- 首先客戶機(jī)與服務(wù)器需要建立連接珊拼。只要單擊某個(gè)超級鏈接,HTTP的工作開始流炕。
- 建立連接后澎现,客戶機(jī)發(fā)送一個(gè)請求給服務(wù)器,請求方式的格式為:統(tǒng)一資源標(biāo)識(shí)符(URL)每辟、協(xié)議版本號剑辫,后邊是MIME信息包括請求修飾符、客戶機(jī)信息和可能的內(nèi)容渠欺。
- 服務(wù)器接到請求后妹蔽,給予相應(yīng)的響應(yīng)信息,其格式為一個(gè)狀態(tài)行挠将,包括信息的協(xié)議版本號胳岂、一個(gè)成功或錯(cuò)誤的代碼,后邊是MIME信息包括服務(wù)器信息舔稀、實(shí)體信息和可能的內(nèi)容乳丰。
- 客戶端接收服務(wù)器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然后客戶機(jī)與服務(wù)器斷開連接内贮。
如果在以上過程中的某一步出現(xiàn)錯(cuò)誤产园,那么產(chǎn)生錯(cuò)誤的信息將返回到客戶端,有顯示屏輸出夜郁。對于用戶來說什燕,這些過程是由HTTP自己完成的,用戶只要用鼠標(biāo)點(diǎn)擊竞端,等待信息顯示就可以了秋冰。
方法
HTTP支持幾種不同的的請求命令,成為 HTTP方法婶熬。每一個(gè)請求報(bào)文中都包含一個(gè)方法剑勾,告訴服務(wù)器執(zhí)行什么動(dòng)作埃撵。
常見http方法 | 描述 |
---|---|
GET | 向特定的資源發(fā)出請求,獲取指定資源 |
POST | 發(fā)送客戶端數(shù)據(jù)到服務(wù)器(如表單提交) |
DELETE | 從服務(wù)器刪除指定資源 |
PUT | 向服務(wù)器指定資源上傳最新數(shù)據(jù)(完整替換數(shù)據(jù)) |
PATCH | 向服務(wù)器指定資源上傳最新數(shù)據(jù)(局部更新數(shù)據(jù)) |
此外虽另,還有head
暂刘,trace
,options
等捂刺。
狀態(tài)碼
當(dāng)服務(wù)器收到請求谣拣,返回的響應(yīng)報(bào)文中會(huì)帶有一個(gè)3位數(shù)字的狀態(tài)碼,告訴客戶端請求是否成功族展。狀態(tài)碼分5類:
整體范圍 | 已定義范圍 | 描述 |
---|---|---|
100-199 | 100-101 | 信息提示 |
200-299 | 200-206 | 成功 |
300-399 | 300-305 | 重定向 |
400-499 | 400-415 | 客戶端錯(cuò)誤 |
500-599 | 500-505 | 服務(wù)器錯(cuò)誤 |
常見的狀態(tài):200
表示成功森缠; 302
表示重定向;404
表示找不到資源仪缸。
HTTP報(bào)文
報(bào)文是具有固定格式的數(shù)據(jù)塊贵涵,由3部分組成:
- 對報(bào)文進(jìn)行描述的起始行(start line)
- 包含屬性的首部塊(header)
- 可選的,包含數(shù)據(jù)的主體部分(body)
請求報(bào)文格式
<method> <request-URL> <version>
<headers>
<entity-body>
響應(yīng)報(bào)文格式
<version> <status> <reason-phrase>
<headers>
<entity-body>
只有起始行不同恰画,主體是可選的宾茂。下圖是一個(gè)報(bào)文例子:
Content-Type 字段
頭信息必須是 ASCII 碼,后面的數(shù)據(jù)可以是任何格式拴还。因此跨晴,服務(wù)器回應(yīng)的時(shí)候,必須告訴客戶端片林,數(shù)據(jù)是什么格式端盆,所以有了Content-Type
這個(gè)字段。
常見的類型:
- text/plain
- text/html
- text/css
- image/jpeg
- image/png
- video/mp4
- audio/mp4
- application/javascript
- application/json
這些數(shù)據(jù)類型總稱為MIME type
费封,每個(gè)值包括一級類型和二級類型爱谁,之間用斜杠分隔。
除了預(yù)定義的類型孝偎,廠商也可以自定義類型:
application/vnd.debian.binary-package
上面的類型表明,發(fā)送的是Debian系統(tǒng)的二進(jìn)制數(shù)據(jù)包凉敲。
MIME type還可以在尾部使用分號衣盾,添加參數(shù)。
Content-Type: text/html; charset=utf-8
上面的類型表明爷抓,發(fā)送的是網(wǎng)頁势决,而且編碼是UTF-8。
客戶端請求的時(shí)候蓝撇,可以使用Accept字段聲明自己可以接受哪些數(shù)據(jù)格式果复。
Accept: /
上面代碼中,客戶端聲明自己可以接受任何格式的數(shù)據(jù)渤昌。
MIME type不僅用在HTTP協(xié)議虽抄,還可以用在其他地方走搁,比如HTML網(wǎng)頁。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<!-- 等同于 -->
<meta charset="utf-8" />
Content-Encoding 字段
由于發(fā)送的數(shù)據(jù)可以是任何格式迈窟,因此可以把數(shù)據(jù)壓縮后再發(fā)送私植。Content-Encoding字段說明數(shù)據(jù)的壓縮方法。
- Content-Encoding: gzip
- Content-Encoding: compress
- Content-Encoding: deflate
客戶端在請求時(shí)车酣,用Accept-Encoding字段說明自己可以接受哪些壓縮方法曲稼。
Accept-Encoding: gzip, deflate
參考資料:
《HTTP權(quán)威指南》
阮一峰-http入門