HTTP報(bào)文詳解
HTTP報(bào)文:它是HTTP應(yīng)用程序之間發(fā)送的數(shù)據(jù)塊。這些數(shù)據(jù)塊以一些文本形式的元信息開頭,這些信息描述了報(bào)文的內(nèi)容及含義,后面跟著可選的數(shù)據(jù)部分。這些報(bào)文都是在客戶端、服務(wù)器和代理之間流動(dòng)。
HTTP報(bào)文的流動(dòng)方向:一次HTTP請(qǐng)求,HTTP報(bào)文會(huì)從“客戶端”流到“代理”再流到“服務(wù)器”,在服務(wù)器工作完成之后,報(bào)文又會(huì)從“服務(wù)器”流到“代理”再流到“客戶端”
報(bào)文的語法:所有的HTTP報(bào)文都可以分為兩類,請(qǐng)求報(bào)文和響應(yīng)報(bào)文。請(qǐng)求和響應(yīng)報(bào)文的基本報(bào)文結(jié)構(gòu)大致是相同的,只有起始行的語法有所不同。
請(qǐng)求報(bào)文:它會(huì)向Web服務(wù)器請(qǐng)求一個(gè)動(dòng)作
請(qǐng)求報(bào)文的格式:
起始行: <method> <request-URL> <version>
頭部: <headers>
主體: <entity-body>
響應(yīng)報(bào)文:它會(huì)將請(qǐng)求的結(jié)果返回給客戶端。
響應(yīng)報(bào)文的格式:
起始行: <version> <status> <reason-phrase>
頭部: <headers>
主體: <entity-body>
下面是對(duì)各部分的簡(jiǎn)要描述:
1、方式(method):客戶端希望服務(wù)器對(duì)資源執(zhí)行的動(dòng)作,是一個(gè)單獨(dú)的詞,比如,GET、POST或HEAD
2、請(qǐng)求URL(request-URL):要直接與服務(wù)器進(jìn)行對(duì)話,只要請(qǐng)求URL是資源的絕對(duì)路徑就可以了,服務(wù)器可以假定自己是URL的主機(jī)/端口
3、版本(version):報(bào)文所使用的HTTP版本。其格式:HTTP/<主要版本號(hào)>.<次要版本號(hào)>
4、狀態(tài)碼(status-code):狀態(tài)碼是三位數(shù)字,描述了請(qǐng)求過程中所發(fā)生的情況。每個(gè)狀態(tài)碼的第一位數(shù)字都用于描述狀態(tài)的一般類別(比如,“成功”、“出錯(cuò)”等等)
5、原因短語(reason-phrase):數(shù)字狀態(tài)碼的可讀版本,包含行終止序列之前的所有文本。原因短語只對(duì)人類有意義,因此,盡管響應(yīng)行HTTP/1.0 200 NOT OK和HTTP/1.0 200 OK中原因短語的含義不同,但同樣都會(huì)被當(dāng)作成功指示處理
6、頭部(header):可以有零個(gè)或多個(gè)頭部,每個(gè)首部都包含一個(gè)名字,后面跟著一個(gè)冒號(hào)(:),然后是一個(gè)可選的空格,接著是一個(gè)值,最后是一個(gè)CRLF首部是由一個(gè)空行(CRLF)結(jié)束的,表示了頭部列表的結(jié)束和實(shí)體主體部分的開始
7、實(shí)體的主體部分(entity-body):實(shí)體的主體部分包含一個(gè)由任意數(shù)據(jù)組成的數(shù)據(jù)塊,并不是所有的報(bào)文都包含實(shí)體的主體部分,有時(shí),報(bào)文只是以一個(gè)CRLF結(jié)束。
展示一些假想的請(qǐng)求和響應(yīng)報(bào)文:

HTTP報(bào)文的組成部分:對(duì)報(bào)文進(jìn)行描述的起始行、包含屬性的頭部塊、可選的,包含數(shù)據(jù)的主體部分
1、起始行:所有的HTTP報(bào)文都以一個(gè)起始行作為開始。請(qǐng)求報(bào)文的起始行說明了要做些什么。響應(yīng)報(bào)文的起始行說明發(fā)生了什么。
請(qǐng)求報(bào)文的起始行:該行包含了一個(gè)方法和一個(gè)請(qǐng)求的URL,還包含HTTP 的版本。
響應(yīng)報(bào)文的起始行:該行包含了響應(yīng)報(bào)文使用的HTTP版本、數(shù)字狀態(tài)碼、原因短語。
2、頭部:HTTP首部字段向請(qǐng)求和響應(yīng)報(bào)文中添加了一些附加信息。本質(zhì)上來說,它們只是一些名/值對(duì)的列表。頭部和協(xié)議配合工作,共同決定了客戶端和服務(wù)器能做什么事情。
頭部的分類:
通用頭部:既可以出現(xiàn)在請(qǐng)求報(bào)文中,也可以出現(xiàn)在響應(yīng)報(bào)文中,它提供了與報(bào)文相關(guān)的最基本的信息
Connection:允許客戶端和服務(wù)器指定與請(qǐng)求/響應(yīng)連接有關(guān)的選項(xiàng)
Date:提供日期和時(shí)間標(biāo)志,說明報(bào)文是什么時(shí)間創(chuàng)建的
MIME-Version:給出了發(fā)送端使用的MIME版本
Trailer:如果報(bào)文采用了分塊傳輸編碼方式,就可以用這個(gè)首部列出位于報(bào)文拖掛部分的首部集合
Transfer-Encoding:告知接收端為了保證報(bào)文的可靠傳輸,對(duì)報(bào)文采用了什么編碼方式
Update:給出了發(fā)送端可能想要“升級(jí)”使用的新版本或協(xié)議
Via:顯示了報(bào)文經(jīng)過的中間節(jié)點(diǎn)(代理、網(wǎng)關(guān))
Cache-Control:用于隨報(bào)文傳送緩存指示
請(qǐng)求頭部:請(qǐng)求頭部是只在請(qǐng)求報(bào)文中有意義的頭部。用于說明是誰或什么在發(fā)送請(qǐng)求、請(qǐng)求源自何處,或者客戶端的喜好及能力
Client-IP:提供了運(yùn)行客戶端的機(jī)器的IP地址
From:提供了客戶端用戶的E-mail地址
Host:給出了接收請(qǐng)求的服務(wù)器的主機(jī)名和端口號(hào)
Referer:提供了包含當(dāng)前請(qǐng)求URI的文檔的URL
UA-Color:提供了與客戶端顯示器的顯示顏色有關(guān)的信息
UA-CPU:給出了客戶端CPU的類型或制造商
UA-OS:給出了運(yùn)行在客戶端機(jī)器上的操作系統(tǒng)名稱及版本
UA-Pixels:提供了客戶端顯示器的像素信息
User-Agent:將發(fā)起請(qǐng)求的應(yīng)用程序名稱告知服務(wù)器
Accept:告訴服務(wù)器能夠發(fā)送哪些媒體類型
Accept-Charset:告訴服務(wù)器能夠發(fā)送哪些字符集
Accept-Encoding:告訴服務(wù)器能夠發(fā)送哪些編碼方式
Accept-Language:告訴服務(wù)器能夠發(fā)送哪些語言
TE:告訴服務(wù)器可以使用那些擴(kuò)展傳輸編碼
Expect:允許客戶端列出某請(qǐng)求所要求的服務(wù)器行為
Range:如果服務(wù)器支持范圍請(qǐng)求,就請(qǐng)求資源的指定范圍
If-Match:如果實(shí)體標(biāo)記與文檔當(dāng)前的實(shí)體標(biāo)記相匹配,就獲取這份文檔
If-Modified-Sinec:除非在某個(gè)指定的日期之后資源被修改過,否則就限制這個(gè)請(qǐng)求
If-None-Match:如果提供的實(shí)體標(biāo)記與當(dāng)前文檔的實(shí)體標(biāo)記不相符,就獲取文檔
If-Range:允許對(duì)文檔的某個(gè)范圍進(jìn)行條件請(qǐng)求
If-Unmodified-Since:除非在某個(gè)指定日期之后資源沒有被修改過,否則就限制這個(gè)請(qǐng)求
Authorization:包含了客戶端提供給服務(wù)器,以便對(duì)其自身進(jìn)行認(rèn)證的數(shù)據(jù)
Cookie:客戶端用它向服務(wù)器傳送數(shù)據(jù)
Cookie2:用來說明請(qǐng)求端支持的cookie版本
Max-Forward:在通往源端服務(wù)器的路徑上,將請(qǐng)求轉(zhuǎn)發(fā)給其他代理或網(wǎng)關(guān)的最大次數(shù)
Proxy-Authorization:這個(gè)首部在與代理進(jìn)行認(rèn)證時(shí)使用的
Proxy-Connection:這個(gè)首部是在與代理建立連接時(shí)使用的
響應(yīng)頭部:響應(yīng)頭部為客戶端提供了一些額外信息,比如誰在發(fā)送響應(yīng)、響應(yīng)者的功能,甚至與響應(yīng)相關(guān)的一些特殊指令
Age:(從最初創(chuàng)建開始)響應(yīng)持續(xù)時(shí)間
Public:服務(wù)器為其資源支持的請(qǐng)求方法列表
Retry-After:如果資源不可用的話,在此日期或時(shí)間重試
Server:服務(wù)器應(yīng)用程序軟件的名稱和版本
Title:對(duì)HTML文檔來說,就是HTML文檔的源端給出的標(biāo)題
Warning:比原因短語更詳細(xì)一些的警告報(bào)文
Accept-Ranges:對(duì)此資源來說,服務(wù)器可接受的范圍類型
Vary:服務(wù)器會(huì)根據(jù)這些首部的內(nèi)容挑選出最適合的資源版本發(fā)送給客戶端
Proxy-Authenticate:來自代理的對(duì)客戶端的質(zhì)詢列表
Set-Cookie:在客戶端設(shè)置數(shù)據(jù),以便服務(wù)器對(duì)客戶端進(jìn)行標(biāo)識(shí)
Set-Cookie2:與Set-Cookie類似
WWW-Authenticate:來自服務(wù)器的對(duì)客戶端的質(zhì)詢列表
實(shí)體首部:描述主體的長(zhǎng)度和內(nèi)容,或者資源自身
Allow:列出了可以對(duì)此實(shí)體執(zhí)行的請(qǐng)求方法
Location:告知客戶端實(shí)體實(shí)際上位于何處,用于將接收端定向到資源的位置(URL)上去
Content-Base:解析主體中的相對(duì)URL時(shí)使用的基礎(chǔ)URL
Content-Encoding:對(duì)主體執(zhí)行的任意編碼方式
Content-Language:理解主體時(shí)最適宜使用的自然語言
Content-Length:主體的長(zhǎng)度
Content-Location:資源實(shí)際所處的位置
Content-MD5:主體的MD5校驗(yàn)和
Content-Range:在整個(gè)資源中此實(shí)體表示的字節(jié)范圍
Content-Type:這個(gè)主體的對(duì)象類型
ETag:與此實(shí)體相關(guān)的實(shí)體標(biāo)記
Expires:實(shí)體不再有效,要從原始的源端再次獲取實(shí)體的日期和時(shí)間
Last-Modified:這個(gè)實(shí)體最后一次被修改的日期和時(shí)間
擴(kuò)展首部:規(guī)范中沒有定義的新首部,開發(fā)者可以自定義一個(gè)首部的值/對(duì)
3、實(shí)體的主體部分:該部分其實(shí)就是HTTP要傳輸?shù)膬?nèi)容,是可選的。HTTP報(bào)文可以承載很多類型的數(shù)字?jǐn)?shù)據(jù),比如,圖片、視頻、HTML文檔電子郵件、軟件應(yīng)用程序等等。
HTTP方法:并不是每個(gè)服務(wù)器都實(shí)現(xiàn)了所有的方法。即使服務(wù)器實(shí)現(xiàn)了所有這些方法,這些方法的使用很可能也是受限的。例如,支持DELETE方法或PUT方法的服務(wù)器可能并不希望任何人都能夠刪除或存儲(chǔ)資源,這些限制通常都是在服務(wù)器的配置中進(jìn)行設(shè)置的。
常用的HTTP方法:
GET方法:通常用于請(qǐng)求服務(wù)器發(fā)送某個(gè)資源。不包含主體
HEAD方法:與GET方法類似,但服務(wù)器在響應(yīng)中只返回首部,使用HEAD方法可以,在不獲取資源的情況下了解資源的情況(比如,判斷其類型);通過查看響應(yīng)中的狀態(tài)碼,看看某個(gè)對(duì)象是否存在;通過查看首部,測(cè)試資源是否被修改了;不包含主體
POST方法:該方法是用來向服務(wù)器發(fā)送數(shù)據(jù)的,常用于HTML表單,包含主體
PUT方法:該方法的語義就是讓服務(wù)器用請(qǐng)求的主體部分來創(chuàng)建一個(gè)由所請(qǐng)求的URL命名的新文檔,如果那個(gè)URL已經(jīng)存在的話,就用這個(gè)主體來替代它。包含主體
TRACE方法:主要用于驗(yàn)證請(qǐng)求是否如愿穿過了請(qǐng)求/響應(yīng)鏈,不包含主體
OPTIONS方法:決定可以在服務(wù)器上執(zhí)行那些方法,不包含主體
DELETE方法:該方法就是請(qǐng)服務(wù)器刪除請(qǐng)求URL所指定的資源,但是客戶端應(yīng)用程序無法保證刪除操作一定會(huì)被執(zhí)行,因?yàn)镠TTP規(guī)范允許服務(wù)器在不通知客戶端的情況下撤銷請(qǐng)求,不包含主體
擴(kuò)展方法:指的是沒有在HTTP/1.1規(guī)范中定義的方法,這些方法為開發(fā)者提供了一種擴(kuò)展這些HTTP服務(wù)能力的手段。
狀態(tài)碼:HTTP狀態(tài)碼被分成了五大類。狀態(tài)碼為客戶端提供了一種理解事務(wù)處理結(jié)果的便捷方式。
1、100~199(信息性狀態(tài)碼):HTTP/1.1向協(xié)議中引入了信息性狀態(tài)碼
2、200~299(成功狀態(tài)碼):客戶端發(fā)起請(qǐng)求時(shí),這些請(qǐng)求通常都是成功的。服務(wù)器有一組用來表示成功的狀態(tài)碼,分別對(duì)應(yīng)于不同類型的請(qǐng)求
3、300~399(重定向狀態(tài)碼):重定向狀態(tài)碼要么告知客戶端使用替代位置來訪問他們所感興趣的資源,要么就提供一個(gè)替代的響應(yīng)而不是資源的內(nèi)容
4、400~499(客戶端錯(cuò)誤狀態(tài)碼):有時(shí)客戶端會(huì)發(fā)送一些服務(wù)器無法處理的東西。瀏覽網(wǎng)頁時(shí),我們都看到過臭名昭著的404 Not Found錯(cuò)誤碼,這只是服務(wù)器在告訴我們,它對(duì)我們請(qǐng)求的資源一無所知
5、500~599(服務(wù)器錯(cuò)誤狀態(tài)碼):有時(shí)客戶端發(fā)送了一條有效請(qǐng)求,服務(wù)器自身卻出錯(cuò)了,這些會(huì)返回5xx狀態(tài)碼

浙公網(wǎng)安備 33010602011771號(hào)