欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

逐步解讀HTTP報(bào)文的組成及含義

Ray Taylor Lin's world   發(fā)布時(shí)間:2016-06-16 11:48:39   作者:林壽山   我要評(píng)論
報(bào)文是HTTP協(xié)議下請(qǐng)求和響應(yīng)的信息基礎(chǔ),這里就帶大家來(lái)逐步解讀HTTP報(bào)文的組成及含義,需要的朋友可以參考下

如果說(shuō)HTTP是因特網(wǎng)的信使,那么HTTP報(bào)文就是運(yùn)送的包裹。所有的HTTP程序都是通過(guò)互相發(fā)送報(bào)文來(lái)完成工作的。本文將介紹HTTP報(bào)文的流動(dòng)方式,報(bào)文的組成部分,請(qǐng)求和響應(yīng)報(bào)文之間的區(qū)別等。

報(bào)文流
HTTP報(bào)文是在HTTP應(yīng)用程序之間發(fā)送的數(shù)據(jù)塊,這些數(shù)據(jù)塊以文本形式存在,以描述了報(bào)文的內(nèi)容及含義的元信息開(kāi)頭,后面跟著可選的數(shù)據(jù)部分。這些報(bào)文在客戶(hù)端、服務(wù)器和代理之間流動(dòng)。一般來(lái)說(shuō),報(bào)文流根據(jù)流向引用以下三種術(shù)語(yǔ):報(bào)文流入(inbound)向服務(wù)器,工作完成之后,會(huì)流出(outbound)向客戶(hù)端或用戶(hù)Agent代理;不管是請(qǐng)求報(bào)文還是響應(yīng)寶安溫,所有報(bào)文的接收者都在發(fā)送者的下游(downstream),報(bào)文只會(huì)向下游流動(dòng)。

報(bào)文的組成部分
報(bào)文由起始行、首部,以及可選的包含數(shù)據(jù)的主體三個(gè)部分組成。所有的HTTP報(bào)文分為兩類(lèi):請(qǐng)求(request)報(bào)文和響應(yīng)(response)報(bào)文,如下圖示例。前者會(huì)向Web服務(wù)器請(qǐng)求對(duì)資源進(jìn)行一些操作,后者承載了狀態(tài)信息和操作產(chǎn)生的所有結(jié)果數(shù)據(jù),把結(jié)果返回給客戶(hù)端。
2016616114838764.jpg (789×217)

起始行
所有的HTTP報(bào)文都以一個(gè)起始行作為開(kāi)始。請(qǐng)求報(bào)文的起始行又稱(chēng)為請(qǐng)求行,說(shuō)明了要做些什么,響應(yīng)報(bào)文的起始行又稱(chēng)為響應(yīng)行,說(shuō)明了發(fā)生了什么。以下是兩種請(qǐng)求行的基本格式:

復(fù)制代碼
代碼如下:
// 請(qǐng)求行格式
<method> <request-URL> <version>
// 響應(yīng)行格式
<version> <status> <reason-phrase>

請(qǐng)求行的方法描述了服務(wù)器應(yīng)該執(zhí)行的操作,請(qǐng)求URL描述了要對(duì)哪個(gè)資源執(zhí)行這個(gè)方法,HTTP版本用來(lái)告知服務(wù)器,客戶(hù)端使用的是哪個(gè)版本的HTTP協(xié)議。響應(yīng)行包含了報(bào)文使用的HTTP版本、數(shù)字狀態(tài)嗎,以及描述操作狀態(tài)的文本形式的原因短語(yǔ)。所有這些字段都由空格分隔。

請(qǐng)求行方法
HTTP規(guī)范中定義了一組常用的請(qǐng)求方法,用來(lái)告知服務(wù)器要做些什么,如下所示:
GET:從服務(wù)器獲取請(qǐng)求URL所指定的資源。
HEAD:只從服務(wù)器獲取文檔的首部。和GET方法的行為很類(lèi)似,但服務(wù)器只返回首部,不包含主體。此方法可以:在不獲取資源的情況下了解資源的情況(比如判斷類(lèi)型);通過(guò)查看響應(yīng)中的狀態(tài)嗎,看看某個(gè)對(duì)象是否存在;通過(guò)查看首部,測(cè)試資源是否被修改了。
POST:向服務(wù)器發(fā)送需要處理的數(shù)據(jù)(包含主體)。通常用它來(lái)支持HTML的表單。
PUT:將請(qǐng)求的主體部分存儲(chǔ)在服務(wù)器上(包含主體)。有些系統(tǒng)允許用戶(hù)創(chuàng)建Web頁(yè)面或上傳文檔,該方法的語(yǔ)義就是讓服務(wù)器用請(qǐng)求的主體來(lái)創(chuàng)建一個(gè)由請(qǐng)求URL命名的新文檔,如果URL已存在則讓這個(gè)主體替代它。
DELETE:從服務(wù)器上刪除請(qǐng)求URL所指定的資源。但客戶(hù)端無(wú)法保證刪除操作一定被執(zhí)行,因?yàn)镠TTP規(guī)范允許服務(wù)器在不通知客戶(hù)端的情況下撤銷(xiāo)請(qǐng)求。
TRACE:對(duì)可能經(jīng)過(guò)代理、網(wǎng)管、防火墻等服務(wù)器的報(bào)文進(jìn)行追蹤,主要用于診斷。報(bào)文行程最后一站的服務(wù)器會(huì)彈回一條TRACE響應(yīng),在主體中攜帶它收到的原始請(qǐng)求報(bào)文,這樣客戶(hù)端就可以查看報(bào)文在一整條請(qǐng)求/響應(yīng)鏈上是如何被修改的。
OPTIONS:查詢(xún)可以在服務(wù)器上執(zhí)行哪些方法,讓客戶(hù)端不用實(shí)際訪問(wèn)那些資源就能判定訪問(wèn)各種資源的最優(yōu)方式。
如果一臺(tái)服務(wù)器要與HTPP 1.1兼容,只要為其資源實(shí)現(xiàn)GET和HEAD方法即可,這兩種方法被認(rèn)為是安全的,它們產(chǎn)生的請(qǐng)求不會(huì)在服務(wù)器上產(chǎn)生什么結(jié)果(實(shí)際上,這是由Web開(kāi)發(fā)者決定的,完全可以使用GET方法來(lái)提交一個(gè)表單,但嚴(yán)重不建議這么做!)。

HTTP還允許定義HTTP/1.1規(guī)范中沒(méi)有定義的擴(kuò)展方法,這些方法為開(kāi)發(fā)者提供了一種擴(kuò)展HTTP服務(wù)能力的手段。很可能大部分HTTP應(yīng)用程序都無(wú)法理解這些擴(kuò)展方法,所以服務(wù)器最好對(duì)擴(kuò)展方法寬容一些。

狀態(tài)碼與原因短語(yǔ)
每條響應(yīng)報(bào)文都會(huì)包含一個(gè)3位數(shù)字和可讀的狀態(tài),用來(lái)告訴客戶(hù)端,服務(wù)器發(fā)生了什么事情。數(shù)字狀態(tài)碼便于程序處理差錯(cuò),原因短語(yǔ)更便于人們理解。狀態(tài)碼分為5類(lèi)(括號(hào)中為已定義范圍):100~199為信息提示(100~101);200~299為成功(200~206);300~399為重定向(300~305),用于告知客戶(hù)端使用替代位置來(lái)訪問(wèn)資源;400~499為客戶(hù)端錯(cuò)誤(400~415);500~599為服務(wù)器錯(cuò)誤(500~505)。限于篇幅下面只介紹常見(jiàn)的狀態(tài)碼,詳情參見(jiàn)HTTP狀態(tài)碼維基百科

101 Switching Protocols:服務(wù)器正在根據(jù)客戶(hù)端的指定,將協(xié)議切換成Update首部所示的協(xié)議。
200 OK:服務(wù)器已成功處理了請(qǐng)求并提供了請(qǐng)求的網(wǎng)頁(yè)
204 No Content:服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容
301 Moved Permanently:請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置。響應(yīng)的Location首部應(yīng)包含資源現(xiàn)在所處的URL。
302 Found:與301類(lèi)似,但這里的移除是臨時(shí)的。將來(lái)的請(qǐng)求仍應(yīng)使用老的URL。
304 Not Modified:客戶(hù)的緩存資源是最新的,要客戶(hù)端使用緩存。
400 Bad Request:告知客戶(hù)端發(fā)送了一個(gè)錯(cuò)誤的請(qǐng)求。
403 Forbidden:請(qǐng)求被服務(wù)器拒絕了。(可能是沒(méi)有訪問(wèn)服務(wù)器的權(quán)限)
404 Not Found:服務(wù)器無(wú)法找到所請(qǐng)求的URL。
410 Gone:服務(wù)器曾經(jīng)有這個(gè)資源,現(xiàn)在沒(méi)有了,與404類(lèi)似。
500 Internal Server Error:服務(wù)器遇到一個(gè)錯(cuò)誤,使其無(wú)法為請(qǐng)求提供服務(wù)。
502 Bad Gateway:作為代理或網(wǎng)關(guān)使用的服務(wù)器收到了上游的無(wú)效響應(yīng)。
503 Service Unavailable:服務(wù)器現(xiàn)在無(wú)法為請(qǐng)求提供服務(wù),但過(guò)一段時(shí)間就可以恢復(fù)服務(wù)。

首部
首部和方法配合工作,共同決定了客戶(hù)端和服務(wù)器能做什么事情。可以將首部分為5個(gè)主要類(lèi)型,以下將分類(lèi)列舉一些首部。

(1)通用首部:客戶(hù)端和服務(wù)器都可以使用的通用首部,提供了與報(bào)文相關(guān)的最基本的信息。
Connection:允許客戶(hù)端和服務(wù)器指定與請(qǐng)求/響應(yīng)連接相關(guān)的選項(xiàng)
Date:日期和時(shí)間標(biāo)志,說(shuō)明報(bào)文是什么時(shí)刻創(chuàng)建的
MIME-Version:給出了發(fā)送端使用的MIME版本
Transfer-Encoding:告知接收端為了保證報(bào)文的可靠傳輸,對(duì)報(bào)文采用了什么編碼方式
Via:顯示了報(bào)文經(jīng)過(guò)的中間節(jié)點(diǎn)(代理、網(wǎng)關(guān)等等)
Cache-Control:用于隨報(bào)文傳送緩存指示
Pragma:另一種隨報(bào)文傳送指示的方式,但并不專(zhuān)用于緩存

(2)請(qǐng)求首部:只在請(qǐng)求報(bào)文中有意義,用于說(shuō)明是誰(shuí)或什么在發(fā)送請(qǐng)求、請(qǐng)求源自何處,或客戶(hù)端的喜好及能力等。
Accept:告訴服務(wù)器能夠發(fā)送哪些媒體類(lèi)型。該首部可以使連接的兩端都受益,客戶(hù)端會(huì)得到它們想要的內(nèi)容,服務(wù)器則不會(huì)浪費(fèi)時(shí)間好帶寬來(lái)發(fā)送客戶(hù)端無(wú)法使用的東西
Accept-Encoding:告訴服務(wù)器能夠發(fā)送哪些編碼方式
Accept-Language:告訴服務(wù)器能夠發(fā)送哪些語(yǔ)言
Referer:提供了包含當(dāng)前請(qǐng)求URI的文檔的URL
User-Agent:告訴服務(wù)器發(fā)起請(qǐng)求的應(yīng)用程序名稱(chēng)
有時(shí)客戶(hù)端希望為請(qǐng)求加上某些限制,要求服務(wù)器在對(duì)請(qǐng)求進(jìn)行響應(yīng)之前,確保某個(gè)條件為真,則可以添加條件請(qǐng)求首部,如Expect(允許客戶(hù)端列出某請(qǐng)求所要求的服務(wù)器行為)、If-Match(若實(shí)體標(biāo)記相匹配,則獲取這份文檔)、If-Modified-Since(除非在某個(gè)指定日期之后資源被修改過(guò),否則限制該請(qǐng)求)等等。
HTTP本身就支持一種對(duì)請(qǐng)求進(jìn)行質(zhì)詢(xún)/響應(yīng)的認(rèn)證機(jī)制,這樣可以使事務(wù)稍微安全一些。因此有安全請(qǐng)求首部,如Authorization(客戶(hù)端提供給服務(wù)器的對(duì)其自身進(jìn)行認(rèn)證的數(shù)據(jù))、Cookie(這個(gè)不是真正的安全首部,但卻是隱含了安全功能)。

(3)響應(yīng)首部:為客戶(hù)端提供了一些額外信息,比如誰(shuí)在發(fā)送響應(yīng)、響應(yīng)者的功能、其它一些特殊指令等
Age:(從最初創(chuàng)建開(kāi)始)響應(yīng)持續(xù)時(shí)間
Public:服務(wù)器為其資源支持的請(qǐng)求方法列表
Retry-After:如果資源不可用,在此時(shí)間重試
Accept-Ranges:(協(xié)商首部)對(duì)此資源來(lái)說(shuō),服務(wù)器可接受的范圍類(lèi)型
Set-Cookie:(安全首部)類(lèi)似Cookie,用于設(shè)置Cookie

(4)實(shí)體首部:用來(lái)描述HTTP報(bào)文的負(fù)荷,提供了有關(guān)實(shí)體及其內(nèi)容的大量信息,可以告知報(bào)文的接收者它在對(duì)什么進(jìn)行處理
Allow:列出可以對(duì)此實(shí)體執(zhí)行的請(qǐng)求方法
Location:告知客戶(hù)端實(shí)體實(shí)際上位于何處,用于重定向資源
Content-Length:主體的長(zhǎng)度
Content-Type:主體的對(duì)象類(lèi)型
(還有很多關(guān)于主體的首部,如Content-Encoding、Content-Base、Content-MD5等等)
ETag:與此實(shí)體相關(guān)的實(shí)體標(biāo)記(用于緩存,下同)
Expires:實(shí)體不再有效,要從源端再次獲取此實(shí)體的日期和時(shí)間
Last-Modified:這個(gè)實(shí)體最后一次被修改的日期和時(shí)間

HTTP請(qǐng)求報(bào)文實(shí)例解剖  
2016616114935723.png (874×471)

①是請(qǐng)求方法,GET和POST是最常見(jiàn)的HTTP方法,除此以外還包括DELETE、HEAD、OPTIONS、PUT、TRACE。不過(guò),當(dāng)前的大多數(shù)瀏覽器只支持GET和POST,Spring 3.0提供了一個(gè)HiddenHttpMethodFilter,允許你通過(guò)“_method”的表單參數(shù)指定這些特殊的HTTP方法(實(shí)際上還是通過(guò)POST提交表單)。服務(wù)端配置了HiddenHttpMethodFilter后,Spring會(huì)根據(jù)_method參數(shù)指定的值模擬出相應(yīng)的HTTP方法,這樣,就可以使用這些HTTP方法對(duì)處理方法進(jìn)行映射了。 
②為請(qǐng)求對(duì)應(yīng)的URL地址,它和報(bào)文頭的Host屬性組成完整的請(qǐng)求URL,③是協(xié)議名稱(chēng)及版本號(hào)。 
④是HTTP的報(bào)文頭,報(bào)文頭包含若干個(gè)屬性,格式為“屬性名:屬性值”,服務(wù)端據(jù)此獲取客戶(hù)端的信息。 
⑤是報(bào)文體,它將一個(gè)頁(yè)面表單中的組件值通過(guò)param1=value1&param2=value2的鍵值對(duì)形式編碼成一個(gè)格式化串,它承載多個(gè)請(qǐng)求參數(shù)的數(shù)據(jù)。不但報(bào)文體可以傳遞請(qǐng)求參數(shù),請(qǐng)求URL也可以通過(guò)類(lèi)似于“/chapter15/user.html? param1=value1&param2=value2”的方式傳遞請(qǐng)求參數(shù)。 
對(duì)照上面的請(qǐng)求報(bào)文,我們把它進(jìn)一步分解,你可以看到一幅更詳細(xì)的結(jié)構(gòu)圖: 
2016616115015857.jpg (427×151)

相關(guān)文章

最新評(píng)論