HTTP 原理
HTTP 是應(yīng)用層協(xié)議,通過 TCP 實(shí)現(xiàn)可靠傳輸,能夠保證數(shù)據(jù)的完整性、正確性。
C/S 架構(gòu)的交互流程
- 客戶端執(zhí)行網(wǎng)絡(luò)請求,從 URL 解析服務(wù)端的主機(jī)名
- 主機(jī)名解析成 IP 地址
- 從 URL 解析出端口號
- 建立客戶端到服務(wù)端的 TCP 連接
- 客戶端通過輸出流向服務(wù)端發(fā)送一條 HTTP 請求
- 服務(wù)端向客戶端回送一條 HTTP 響應(yīng)報(bào)文
- 客戶端從輸入流獲取報(bào)文
- 客戶端解析報(bào)文,關(guān)閉連接
- 客戶端將結(jié)果顯示在 UI
HTTP 請求方式
HTTP 常見請求方式有 GET、POST、DELETE、PUT、HEAD、TRACE、OPTIONS。
GET
用來獲取服務(wù)器中的某個(gè)資源
POST
用來向服務(wù)器傳遞數(shù)據(jù),比如遞交 HTML 表單
PUT
用來向服務(wù)器寫入資源。有些發(fā)布系統(tǒng)允許用戶創(chuàng)建 Web 頁面,并用 PUT 直接將其傳輸?shù)?Web 服務(wù)器上
DELETE
用來請服務(wù)器刪除 URL 所指定的資源。但是,客戶端應(yīng)用程序無法保證刪除操作一定會被執(zhí)行。因?yàn)?,HTTP 規(guī)范允許服務(wù)器在不通知客戶端的情況下撤銷請求
HEAD
與 GET 方法行為類型,但是服務(wù)器在響應(yīng)中只返回首部。不會返回實(shí)體的主體部分。這就允許客戶端在未獲取實(shí)際資源的情況下,對資源的首部進(jìn)行檢查。
TRACE
TRACE 方法允許客戶端在最終將請求發(fā)送給服務(wù)器時(shí),看看它變成什么樣子。TRACE 請求會在目的服務(wù)器端發(fā)起一個(gè)“環(huán)回”診斷。行程最后一站的服務(wù)器會彈回一條 TRACE 響應(yīng),并在響應(yīng)主體中攜帶它收到的原始請求報(bào)文。這樣客戶端就可以查看在所有中間 HTTP 應(yīng)用程序組成的請求/響應(yīng)鏈上,原始報(bào)文是否以及如何被毀壞或修改過。
OPTIONS
OPTIONS 方法請求 Web 服務(wù)器告知其支持的各種功能。可以詢問服務(wù)器通常支持哪些方法,或者對某些特殊資源支持哪些方法(有些服務(wù)器可能只支持對一些特殊類型對象使用特定的操作)。這為客戶端應(yīng)用程序提供了一種手段,使其不用實(shí)際訪問那些資源就能判定訪問各種資源的最優(yōu)方式。
HTTP 報(bào)文格式解析
HTTP 請求報(bào)文由請求行(request line)、請求頭部(header)、空行和請求數(shù)據(jù) 4 個(gè)部分組成。
|請求方法 | 空格 | URL | 空格 | HTTP 版本 | 回車符 | 換行符 |
| ----------頭部字段名:值 --------- | 回車符 | 換行符 |
|------回車符 -----------|------- 換行符---------- |
|-------------------請求數(shù)據(jù)-------------------- |
1.起始行
報(bào)文的第一行就是起始行,在請求報(bào)文中用來說明要以什么方式做什么請求,而在響應(yīng)報(bào)文中粗略說明了報(bào)文的執(zhí)行結(jié)果。
2.首部字段
起始行后面有零個(gè)或者多個(gè)首部字段。每個(gè)首部字段都包含一個(gè)名字和一個(gè)值,為了便于解析,兩者之間用冒號(如 Connection:Keep-Alive)來分隔。首部以一個(gè)空行結(jié)束。添加一個(gè)首部字段和添加新行一樣簡單。
3.主體
首部字段的空行之后就是可選的報(bào)文主體,其中包含了所有類型的數(shù)據(jù)。請求主體中包括了要發(fā)給 Web 服務(wù)器的數(shù)據(jù);響應(yīng)主體中裝載了要返回給客戶端的數(shù)據(jù)。起始行和首部都是結(jié)構(gòu)化的文本形式,而主體可以包含任意的二進(jìn)制數(shù)據(jù)(如圖片、視頻、音軌、軟件程序)。當(dāng)然,主體中也可以包含文本。
響應(yīng)報(bào)文
HTTP 響應(yīng)也由 3 個(gè)部分組成,分別是:狀態(tài)行、消息報(bào)頭、響應(yīng)正文。
<狀態(tài)行>
<響應(yīng)報(bào)文 header>
<空行>
[響應(yīng)報(bào)文內(nèi)容]
在響應(yīng)中唯一真正的區(qū)別在于第一行中用狀態(tài)信息代替了請求信息。狀態(tài)行(status line)通過提供一個(gè)狀態(tài)碼來說明請求的資源情況。
狀態(tài)行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version 表示服務(wù)器 HTTP 協(xié)議的版本;Status-Code 表示服務(wù)器發(fā)回的響應(yīng)狀態(tài)代碼;Reason-Phrase 表示狀態(tài)代碼的文本描述。狀態(tài)代碼由 3 位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,有 5 中可能取值。
| 取值范圍 | 含義 |
|---|---|
| 100-199 | 指示信息-表示請求已經(jīng)接收,繼續(xù)處理 |
| 200-299 | 請求成功。表示請求已經(jīng)被成功接收、理解 |
| 300-399 | 重定向。要完成請求必須做進(jìn)一步操作 |
| 400-499 | 客戶端錯(cuò)誤。請求有語法錯(cuò)誤或請求無法實(shí)現(xiàn) |
| 500-599 | 服務(wù)器端錯(cuò)誤。服務(wù)器未能實(shí)現(xiàn)合法請求 |
常見狀態(tài)代碼
| 代碼 | 狀態(tài) | 說明 |
|---|---|---|
| 200 | OK | 客戶端請求成功 |
| 400 | Bad Request | 客戶端請求有語法錯(cuò)誤,不能被服務(wù)器所理解 |
| 401 | Unauthorized | 請求未經(jīng)授權(quán) |
| 403 | Forbidden | 服務(wù)器收到請求,但是拒絕提供服務(wù) |
| 404 | Not Found | 請求資源不存在 |
| 500 | Internal Server Error | 服務(wù)器發(fā)生不可預(yù)期錯(cuò)誤 |
| 503 | Server Unavailable | 服務(wù)器當(dāng)前不能處理客戶端的請求 |