?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
HTTP消息是數(shù)據(jù)在服務(wù)器和客戶端之間交換的方式。有兩種類型的消息:請求客戶端發(fā)送到觸發(fā)服務(wù)器上的動作,并且響應(yīng),從服務(wù)器的答案。
HTTP消息由以ASCII編碼的文本信息組成,并跨越多行。在HTTP / 1.1及其早期版本的協(xié)議中,這些消息是通過連接公開發(fā)送的。在HTTP / 2中,曾經(jīng)人類可讀的消息現(xiàn)在被劃分為HTTP幀,從而提供優(yōu)化和性能改進(jìn)。
Web開發(fā)人員或網(wǎng)站管理員很少制作這些文本HTTP消息:軟件,Web瀏覽器,代理或Web服務(wù)器,執(zhí)行此操作。他們通過配置文件(代理或服務(wù)器),API(瀏覽器)或其他接口提供HTTP消息。
HTTP / 2二進(jìn)制組幀機(jī)制被設(shè)計為不需要對應(yīng)用的API或配置文件進(jìn)行任何修改:它對用戶來說是廣泛透明的。
HTTP請求和響應(yīng)共享相似的結(jié)構(gòu)并由以下部分組成:
一個起始行描述的要求來實(shí)現(xiàn),或者它無論成功或失敗的狀態(tài)。這條起始線總是一條線。
一組可選的HTTP標(biāo)頭,用于指定請求或描述消息中包含的主體。
表示請求的所有元信息的空白行已經(jīng)發(fā)送。
包含與請求相關(guān)的數(shù)據(jù)的可選主體(如HTML表單的內(nèi)容)或與響應(yīng)關(guān)聯(lián)的文檔。主體和其大小的存在由開始行和HTTP標(biāo)頭指定。
HTTP消息的起始行和HTTP標(biāo)頭統(tǒng)稱為請求頭,而其有效負(fù)載稱為主體。
HTTP請求是客戶端發(fā)送的消息,以在服務(wù)器上啟動一個操作。他們的起點(diǎn)包含三個要素:
1.一個HTTP方法,動詞(例如GET
,PUT
或POST
),或者名詞(像HEAD
或OPTIONS
要被執(zhí)行),描述動作。例如,GET
表示應(yīng)該提取資源或者POST
意味著數(shù)據(jù)被推送到服務(wù)器(創(chuàng)建或修改資源或生成臨時文檔以發(fā)回)。
2.所述請求對象,通常是一個URL,或協(xié)議,端口和域的絕對路徑通常特征在于請求上下文。這個請求目標(biāo)的格式因不同的HTTP方法而異。有可能
絕對路徑,最后是一個'?'
查詢字符串。這是最常見的形式,被稱為起源形式,并用于與GET
,POST
,HEAD
,和OPTIONS
方法。 POST / HTTP 1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
當(dāng)連接到代理服務(wù)器時,完整的URL稱為絕對表單,主要用于GET
。 GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
URL的權(quán)威組成部分由域名和可選的端口(前綴為a ':'
)組成,稱為權(quán)威表單。它僅CONNECT
在設(shè)置HTTP隧道時使用。 CONNECT developer.mozilla.org:80 HTTP/1.1
的星號形式,一個簡單的星號('*'
)用于OPTIONS
表示該服務(wù)器作為一個整體。 OPTIONS * HTTP/1.1
3.HTTP版本,它定義了剩余的消息的結(jié)構(gòu),充當(dāng)?shù)念A(yù)期版本的指示符以用于響應(yīng)。
來自請求的HTTP標(biāo)頭遵循HTTP標(biāo)頭的相同基本結(jié)構(gòu):不區(qū)分大小寫的字符串,后跟冒號(':'
)和結(jié)構(gòu)取決于標(biāo)頭的值。包括該值在內(nèi)的整個標(biāo)題由一條單獨(dú)的行組成,該行可能相當(dāng)長。
有許多請求頭可用。他們可以分成幾組:
一般標(biāo)題,如Via
整個應(yīng)用于郵件。
請求標(biāo)頭,比如User-Agent
,通過給定上下文(比如)或者通過有條件地限制它(比如)Accept-Type
來進(jìn)一步指定它(比如Accept-Language
)來修改請求。Referer
If-None
實(shí)體標(biāo)題,如Content-Length
適用于請求的主體。顯然,如果請求中沒有主體,則不會傳輸此頭。
請求的最后部分是它的主體。并非所有的請求有一個:獲取資源,如請求GET
,HEAD
,DELETE,或選項,通常不需要一個。有些請求會將數(shù)據(jù)發(fā)送到服務(wù)器以更新它:與POST
請求(包含HTML表單數(shù)據(jù))的情況相同。
主體大致可以分為兩類:
單資源主體,由一個單一文件組成,由兩個標(biāo)頭定義:Content-Type
和Content-Length
。
多資源主體,由多部分主體組成,每個主體包含不同位的信息。這通常與HTML表單相關(guān)聯(lián)。
HTTP響應(yīng)的起始行(稱為狀態(tài)行)包含以下信息:
協(xié)議版本:通常為HTTP/1.1
。
狀態(tài)碼:指示請求的成功或失敗。常見的狀態(tài)代碼為200
,404
或302
一個狀態(tài)文本:簡要的,純粹的信息性的狀態(tài)代碼的文本描述,以幫助人們理解HTTP消息。
典型的狀態(tài)行如下所示: HTTP/1.1 404 Not Found.
響應(yīng)的HTTP頭與其他報頭的結(jié)構(gòu)相同:不區(qū)分大小寫的字符串,后跟冒號(':'
)和結(jié)構(gòu)取決于頭部類型的值。包括其價值在內(nèi)的整個表頭呈現(xiàn)為一條線。
有許多響應(yīng)頭可用。這些可以分成幾個組:
一般報頭,如Via
適用于整個消息。
響應(yīng)報頭,Vary
并Accept-Ranges
提供有關(guān)不適合狀態(tài)行的服務(wù)器的其他信息。
實(shí)體報頭,如Content-Length
適用于請求的主體。當(dāng)請求中沒有主體時顯然不會傳輸這樣的頭文件。
答復(fù)的最后部分是主體。并不是所有的答復(fù)都是:有狀態(tài)代碼的答復(fù),就像201
或204
通常不會。
主體大致可以分為三類:
單一資源主體,由一個已知長度的單個文件組成,由兩個標(biāo)頭定義:Content-Type
和Content-Length
。
單一資源主體,由一個長度未知的單個文件組成,由塊Transfer-Encoding
設(shè)置為chunked
。
多資源主體,由多部分主體組成,每個主體包含不同的信息部分。這些比較少見。
HTTP / 1.x消息在性能方面有一些缺點(diǎn):
與主體不同,標(biāo)題是未壓縮的。
從一條消息到另一條消息,標(biāo)題通常非常相似,但仍然在連接中重復(fù)。
不能多路復(fù)用。多個連接需要在同一臺服務(wù)器上打開:熱TCP連接比冷連接更有效。
HTTP / 2引入了一個額外的步驟:它將HTTP / 1.x消息分成嵌入流中的幀。數(shù)據(jù)和標(biāo)題幀是分開的,這允許標(biāo)題壓縮。多個流可以組合在一起,這個過程稱為多路復(fù)用,允許更高效的底層TCP連接。
HTTP框架現(xiàn)在對Web開發(fā)人員是透明的。這是HTTP / 2中HTTP / 1.1消息和底層傳輸協(xié)議之間的附加步驟。Web開發(fā)人員使用HTTP幀所使用的API不需要進(jìn)行任何更改; 當(dāng)瀏覽器和服務(wù)器都可用時,HTTP / 2將打開并使用。
HTTP消息是使用HTTP的關(guān)鍵; 它們的結(jié)構(gòu)很簡單,而且它們具有高度的可擴(kuò)展性。HTTP / 2成幀機(jī)制在HTTP / 1.x語法和底層傳輸協(xié)議之間添加了一個新的中間層,而不需要從根本上對其進(jìn)行修改:基于成熟的機(jī)制。