HTTP 原理
HTTP 是應(yīng)用層協(xié)議座享,通過(guò) TCP 實(shí)現(xiàn)可靠傳輸帝嗡,能夠保證數(shù)據(jù)的完整性峡蟋、正確性坟桅。
C/S 架構(gòu)的交互流程
- 客戶端執(zhí)行網(wǎng)絡(luò)請(qǐng)求,從 URL 解析服務(wù)端的主機(jī)名
- 主機(jī)名解析成 IP 地址
- 從 URL 解析出端口號(hào)
- 建立客戶端到服務(wù)端的 TCP 連接
- 客戶端通過(guò)輸出流向服務(wù)端發(fā)送一條 HTTP 請(qǐng)求
- 服務(wù)端向客戶端回送一條 HTTP 響應(yīng)報(bào)文
- 客戶端從輸入流獲取報(bào)文
- 客戶端解析報(bào)文蕊蝗,關(guān)閉連接
- 客戶端將結(jié)果顯示在 UI
HTTP 請(qǐng)求方式
HTTP 常見(jiàn)請(qǐng)求方式有 GET仅乓、POST、DELETE蓬戚、PUT夸楣、HEAD、TRACE子漩、OPTIONS豫喧。
GET
用來(lái)獲取服務(wù)器中的某個(gè)資源
POST
用來(lái)向服務(wù)器傳遞數(shù)據(jù),比如遞交 HTML 表單
PUT
用來(lái)向服務(wù)器寫(xiě)入資源痛单。有些發(fā)布系統(tǒng)允許用戶創(chuàng)建 Web 頁(yè)面嘿棘,并用 PUT 直接將其傳輸?shù)?Web 服務(wù)器上
DELETE
用來(lái)請(qǐng)服務(wù)器刪除 URL 所指定的資源。但是旭绒,客戶端應(yīng)用程序無(wú)法保證刪除操作一定會(huì)被執(zhí)行。因?yàn)榻谷耍琀TTP 規(guī)范允許服務(wù)器在不通知客戶端的情況下撤銷(xiāo)請(qǐng)求
HEAD
與 GET 方法行為類(lèi)型挥吵,但是服務(wù)器在響應(yīng)中只返回首部。不會(huì)返回實(shí)體的主體部分花椭。這就允許客戶端在未獲取實(shí)際資源的情況下忽匈,對(duì)資源的首部進(jìn)行檢查。
TRACE
TRACE 方法允許客戶端在最終將請(qǐng)求發(fā)送給服務(wù)器時(shí)矿辽,看看它變成什么樣子丹允。TRACE 請(qǐng)求會(huì)在目的服務(wù)器端發(fā)起一個(gè)“環(huán)回”診斷郭厌。行程最后一站的服務(wù)器會(huì)彈回一條 TRACE 響應(yīng),并在響應(yīng)主體中攜帶它收到的原始請(qǐng)求報(bào)文雕蔽。這樣客戶端就可以查看在所有中間 HTTP 應(yīng)用程序組成的請(qǐng)求/響應(yīng)鏈上折柠,原始報(bào)文是否以及如何被毀壞或修改過(guò)。
OPTIONS
OPTIONS 方法請(qǐng)求 Web 服務(wù)器告知其支持的各種功能批狐∩仁郏可以詢問(wèn)服務(wù)器通常支持哪些方法,或者對(duì)某些特殊資源支持哪些方法(有些服務(wù)器可能只支持對(duì)一些特殊類(lèi)型對(duì)象使用特定的操作)嚣艇。這為客戶端應(yīng)用程序提供了一種手段承冰,使其不用實(shí)際訪問(wèn)那些資源就能判定訪問(wèn)各種資源的最優(yōu)方式。
HTTP 報(bào)文格式解析
HTTP 請(qǐng)求報(bào)文由請(qǐng)求行(request line)食零、請(qǐng)求頭部(header)困乒、空行和請(qǐng)求數(shù)據(jù) 4 個(gè)部分組成。
|請(qǐng)求方法 | 空格 | URL | 空格 | HTTP 版本 | 回車(chē)符 | 換行符 |
| ----------頭部字段名:值 --------- | 回車(chē)符 | 換行符 |
|------回車(chē)符 -----------|------- 換行符---------- |
|-------------------請(qǐng)求數(shù)據(jù)-------------------- |
1.起始行
報(bào)文的第一行就是起始行贰谣,在請(qǐng)求報(bào)文中用來(lái)說(shuō)明要以什么方式做什么請(qǐng)求娜搂,而在響應(yīng)報(bào)文中粗略說(shuō)明了報(bào)文的執(zhí)行結(jié)果。
2.首部字段
起始行后面有零個(gè)或者多個(gè)首部字段冈爹。每個(gè)首部字段都包含一個(gè)名字和一個(gè)值涌攻,為了便于解析,兩者之間用冒號(hào)(如 Connection:Keep-Alive)來(lái)分隔频伤。首部以一個(gè)空行結(jié)束恳谎。添加一個(gè)首部字段和添加新行一樣簡(jiǎn)單。
3.主體
首部字段的空行之后就是可選的報(bào)文主體憋肖,其中包含了所有類(lèi)型的數(shù)據(jù)因痛。請(qǐng)求主體中包括了要發(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)信息代替了請(qǐng)求信息久橙。狀態(tài)行(status line)通過(guò)提供一個(gè)狀態(tài)碼來(lái)說(shuō)明請(qǐng)求的資源情況俄占。
狀態(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)的類(lèi)別碰凶,有 5 中可能取值暮芭。
取值范圍 | 含義 |
---|---|
100-199 | 指示信息-表示請(qǐng)求已經(jīng)接收,繼續(xù)處理 |
200-299 | 請(qǐng)求成功欲低。表示請(qǐng)求已經(jīng)被成功接收辕宏、理解 |
300-399 | 重定向。要完成請(qǐng)求必須做進(jìn)一步操作 |
400-499 | 客戶端錯(cuò)誤砾莱。請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn) |
500-599 | 服務(wù)器端錯(cuò)誤瑞筐。服務(wù)器未能實(shí)現(xiàn)合法請(qǐng)求 |
常見(jiàn)狀態(tài)代碼
代碼 | 狀態(tài) | 說(shuō)明 |
---|---|---|
200 | OK | 客戶端請(qǐng)求成功 |
400 | Bad Request | 客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解 |
401 | Unauthorized | 請(qǐng)求未經(jīng)授權(quán) |
403 | Forbidden | 服務(wù)器收到請(qǐng)求腊瑟,但是拒絕提供服務(wù) |
404 | Not Found | 請(qǐng)求資源不存在 |
500 | Internal Server Error | 服務(wù)器發(fā)生不可預(yù)期錯(cuò)誤 |
503 | Server Unavailable | 服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求 |