常见的HTTP Method深度解析
HTTP版本
在HTTP的發(fā)展過(guò)程中,出現(xiàn)了很多HTTP版本,其中的大部分協(xié)議都是向下兼容的。在進(jìn)行HTTP請(qǐng)求時(shí),客戶(hù)端在請(qǐng)求時(shí)會(huì)告訴服務(wù)器它采用的協(xié)議版本號(hào),而服務(wù)器則會(huì)在使用相同或者更早的協(xié)議版本進(jìn)行響應(yīng)。
HTTP/0.9
這是HTTP最早大規(guī)模使用的版,現(xiàn)已過(guò)時(shí)。在這個(gè)版本中 只有GET一種請(qǐng)求方法,在HTTP通訊也沒(méi)有指定版本號(hào),也不支持請(qǐng)求頭信息。該版本不支持POST等方法,因此客戶(hù)端向服務(wù)器傳遞信息的能力非常有限。
HTTP/1.0
這個(gè)版本是第一個(gè)在HTTP通訊中指定版本號(hào)的協(xié)議版本,HTTP/1.0至今仍被廣泛采用,特別是在代理服務(wù)器中。
HTTP/1.0支持:GET、POST、HEAD三種HTTP請(qǐng)求方法。
HTTP/1.1
HTTP/1.1是當(dāng)前正在使用的版本。該版本默認(rèn)采用持久連接,并能很好地配合代理服務(wù)器工作。還支持以管道方式同時(shí)發(fā)送多個(gè)請(qǐng)求,以便降低線(xiàn)路負(fù)載,提高傳輸速度。
HTTP/1.1新增了:OPTIONS、PUT、DELETE、TRACE、CONNECT五種HTTP請(qǐng)求方法。
HTTP/2
這個(gè)版本是最新發(fā)布的版本,于今年5月(2015年5月)做HTTP標(biāo)準(zhǔn)正式發(fā)布。HTTP/2通過(guò)支持請(qǐng)求與相應(yīng)的多路重用來(lái)減少延遲,通過(guò)壓縮HTTP頭字段將協(xié)議開(kāi)銷(xiāo)降到最低,同時(shí)增加了對(duì)請(qǐng)求優(yōu)先級(jí)和服務(wù)器端推送的支持。
HTTP Method
GET
GET 是最常用的方法。通常用于請(qǐng)求服務(wù)器發(fā)送某個(gè)資源。HTTP/1.1 要求服務(wù)器實(shí)現(xiàn)此方法。
HEAD
HEAD 方法與 GET 方法的行為很類(lèi)似,但服務(wù)器在響應(yīng)中只返回首部。不會(huì)返回實(shí)體的主體部分。這就允許客戶(hù)端在未獲取實(shí)際資源的情況下,對(duì)資源的首部進(jìn)行檢查。使用 HEAD,可以:
- 在不獲取資源的情況下了解資源的情況(比如,判斷其類(lèi)型);
- 通過(guò)查看響應(yīng)中的狀態(tài)碼,看看某個(gè)對(duì)象是否存在;
- 通過(guò)查看首部,測(cè)試資源是否被修改了。
服務(wù)器開(kāi)發(fā)者必須確保返回的首部與 GET 請(qǐng)求所返回的首部完全相同。遵循 HTTP/1.1 規(guī)范,就必須實(shí)現(xiàn) HEAD 方法。
PUT
與 GET 從服務(wù)器讀取文檔相反,PUT 方法會(huì)向服務(wù)器寫(xiě)入文檔。有些發(fā)布系統(tǒng)允許用戶(hù)創(chuàng)建 Web 頁(yè)面,并用 PUT 直接將其安裝到 Web 服務(wù)器上去。
PUT 方法的語(yǔ)義就是讓服務(wù)器用請(qǐng)求的主體部分來(lái)創(chuàng)建一個(gè)由所請(qǐng)求的 URL 命名的新文檔,或者,如果那個(gè) URL 已經(jīng)存在的話(huà),就用這個(gè)主體來(lái)替代它。
因?yàn)?PUT 允許用戶(hù)對(duì)內(nèi)容進(jìn)行修改,所以很多 Web 服務(wù)器都要求在執(zhí)行 PUT 之前,用密碼登錄。
和POST方法一樣,PUT方法也改變了資源的狀態(tài),所以是 非安全 的。但是有一點(diǎn)和POST不同,它是 冪等 的,這是為什么呢?想想setter函數(shù)吧,重復(fù)調(diào)用,只要參數(shù)是一樣的,表述就是不變的。
POST
POST 方法起初是用來(lái)向服務(wù)器輸入數(shù)據(jù)的。實(shí)際上,通常會(huì)用它來(lái)支持 HTML 的表單。表單中填好的數(shù)據(jù)通常會(huì)被送給服務(wù)器,然后由服務(wù)器將其發(fā)送到它要去的地方(比如,送到一個(gè)服務(wù)器網(wǎng)關(guān)程序中,然后由這個(gè)程序?qū)ζ溥M(jìn)行處理)。
注: POST 用于向服務(wù)器發(fā)送數(shù)據(jù)。PUT 用于向服務(wù)器上的資源(例如文件)中存儲(chǔ)數(shù)據(jù)。
TRACE
客戶(hù)端發(fā)起一個(gè)請(qǐng)求時(shí),這個(gè)請(qǐng)求可能要穿過(guò)防火墻、代理、網(wǎng)關(guān)或其他一些應(yīng)用程序。每個(gè)中間節(jié)點(diǎn)都可能會(huì)修改原始的 HTTP 請(qǐng)求。TRACE 方法允許客戶(hù)端在 最終將請(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)文。這樣客戶(hù)端就可以查看在所有中間 HTTP 應(yīng)用程序組成的請(qǐng)求 / 響應(yīng)鏈上,原始報(bào)文是否,以及如何被毀壞或修改過(guò)。
TRACE 方法主要用于診斷;也就是說(shuō),用于驗(yàn)證請(qǐng)求是否如愿穿過(guò)了請(qǐng)求 / 響應(yīng)鏈。它也是一種很好的工具,可以用來(lái)查看代理和其他應(yīng)用程序?qū)τ脩?hù)請(qǐng)求所產(chǎn)生 效果。
盡管 TRACE 可以很方便地用于診斷,但它確實(shí)也有缺點(diǎn),它假定中間應(yīng)用程序?qū)Ω鞣N不同類(lèi)型請(qǐng)求(不同的方法——GET、HEAD、POST 等)的處理是相同的。
很多 HTTP 應(yīng)用程序會(huì)根據(jù)方法的不同做出不同的事情——比如,代理可能會(huì)將 POST 請(qǐng)求直接發(fā)送給服務(wù)器,而將 GET 請(qǐng)求發(fā)送給另一個(gè) HTTP 應(yīng)用程序(比如 Web 緩存)。TRACE 并不提供區(qū)分這些方法的機(jī)制。通常,中間應(yīng)用程序會(huì)自行決定對(duì) TRACE 請(qǐng)求的處理方式。
TRACE 請(qǐng)求中不能帶有實(shí)體的主體部分。TRACE 響應(yīng)的實(shí)體主體部分包含了響應(yīng)服務(wù)器收到的請(qǐng)求的精確副本。
當(dāng) TRACE 請(qǐng)求到達(dá)目的服務(wù)器時(shí),16 整條請(qǐng)求報(bào)文都會(huì)被封裝在一條 HTTP 響應(yīng)的主體中回送給發(fā)送端。當(dāng) TRACE 響應(yīng)到達(dá)時(shí),客戶(hù)端可以檢查服務(wù)器收到的確切報(bào)文,以及它所經(jīng)過(guò)的代理列表(在 Via 首部)。TRACE 響應(yīng)的 Content-Type 為 message/http,狀態(tài)為 200 OK。
Via
Via 首部字段列出了與報(bào)文途經(jīng)的每個(gè)中間節(jié)點(diǎn)(代理或網(wǎng)關(guān))有關(guān)的信息。報(bào)文每經(jīng)過(guò)一個(gè)節(jié)點(diǎn),都必須將這個(gè)中間節(jié)點(diǎn)添加到 Via 列表的末尾。
代理也可以用 Via 首部來(lái)檢測(cè)網(wǎng)絡(luò)中的路由循環(huán)。代理應(yīng)該在發(fā)送一條請(qǐng)求之前, 在 Via 首部插入一個(gè)與其自身有關(guān)的獨(dú)特字符串,并在輸入的請(qǐng)求中查找這個(gè)字符 串,以檢測(cè)網(wǎng)絡(luò)中是否存在路由循環(huán)。
Via 首部字段包含一個(gè)由逗號(hào)分隔的 路標(biāo)(waypoint)。每個(gè)路標(biāo)都表示一個(gè)獨(dú)立的 代理服務(wù)器或網(wǎng)關(guān),且包含與那個(gè)中間節(jié)點(diǎn)的協(xié)議和地址有關(guān)的信息。下面是一個(gè) 帶有兩個(gè)路標(biāo)的 Via 首部實(shí)例:
Via = 1.1 cache.joes-hardware.com, 1.1 proxy.irenes-isp.netVia 首部的正規(guī)語(yǔ)法如下所示:
Via = "Via" ":" 1#( waypoint ) waypoint = ( received-protocol received-by [ comment ] ) received-protocol = [ protocol-name "/" ] protocol-version received-by = ( host [ ":" port ] ) | pseudonym注意,每個(gè) Via 路標(biāo)中最多包含 4 個(gè)組件:一個(gè)可選的協(xié)議名(默認(rèn)為 HTTP)、一 個(gè)必選的協(xié)議版本、一個(gè)必選的節(jié)點(diǎn)名和一個(gè)可選的描述性注釋。
OPTIONS
OPTIONS 方法請(qǐng)求 Web 服務(wù)器告知其支持的各種功能。可以詢(xún)問(wèn)服務(wù)器通常支持哪些方法,或者對(duì)某些特殊資源支持哪些方法。(有些服務(wù)器可能只支持對(duì)一些特殊類(lèi)型的對(duì)象使用特定的操作)。
通過(guò)使用 OPTIONS,客戶(hù)端可以在與服務(wù)器進(jìn)行交互之前,確定服務(wù)器的能力,這樣它就可以更方便地與具備不同特性的代理和服務(wù)器進(jìn)行互操作了。
這為客戶(hù)端應(yīng)用程序提供了一種手段,使其不用實(shí)際訪(fǎng)問(wèn)那些資源就能判定訪(fǎng)問(wèn)各種資源的最優(yōu)方式。
如果 OPTIONS 請(qǐng)求的 URI 是個(gè)星號(hào)(*),請(qǐng)求的就是整個(gè)服務(wù)器所支持的功能。
比如:
OPTIONS * HTTP/1.1如果 URI 是個(gè)實(shí)際資源地址,OPTIONS 請(qǐng)求就是在查詢(xún)那個(gè)特定資源的可用特性:
OPTIONS http://www.joes-hardware.com/index.html HTTP/1.1如果成功,OPTIONS方法就會(huì)返回一個(gè)包含了各種首部字段的200 OK響應(yīng),這些 字段描述了服務(wù)器所支持的,或資源可用的各種可選特性。HTTP/1.1 在響應(yīng)中唯一 指定的首部字段是 Allow 首部,這個(gè)首部用于描述服務(wù)器所支持的各種方法(或者 服務(wù)器上的特定資源)。OPTIONS 允許在可選的響應(yīng)主體中包含更多的信息,但并沒(méi)有對(duì)這種用法進(jìn)行定義。
Allow首部
Allow 實(shí)體首部字段列出了請(qǐng)求 URI 標(biāo)識(shí)的資源所支持的方法列表,如果請(qǐng)求 URI為 * 的話(huà),列出的就是整個(gè)服務(wù)器所支持的方法列表。例如:
Allow: GET, HEAD, PUT可以將 Allow 首部作為請(qǐng)求首部,建議在新的資源上支持某些方法。并不要求服務(wù) 器支持這些方法,但應(yīng)該在相應(yīng)的響應(yīng)中包含一個(gè) Allow 首部,列出它實(shí)際支持的方法。
因?yàn)榭蛻?hù)端可能已經(jīng)通過(guò)其他途徑與原始服務(wù)器進(jìn)行了交流,所以即使代理無(wú)法理解指定的所有方法,也不能對(duì) Allow 首部字段進(jìn)行修改。
DELETE
顧名思義,DELETE 方法所做的事情就是請(qǐng)服務(wù)器刪除請(qǐng)求 URL 所指定的資源。 但是,客戶(hù)端應(yīng)用程序無(wú)法保證刪除操作一定會(huì)被執(zhí)行。因?yàn)?HTTP 規(guī)范允許服務(wù) 器在不通知客戶(hù)端的情況下撤銷(xiāo)請(qǐng)求。
和POST方法一樣,DELETE方法也改變了資源的狀態(tài),所以是非安全的。但是有一點(diǎn)和POST不同,它是冪等的,也就是說(shuō),就算是服務(wù)器在前一個(gè)請(qǐng)求中已經(jīng)刪除了資源,它也必須返回200.這就意味著,我們?cè)趯?shí)現(xiàn)服務(wù)端的該方法是,需要跟蹤已經(jīng)刪除的資源,否則就會(huì)返回404的。
CONNECT
CONNECT方法是HTTP/1.1協(xié)議預(yù)留的,能夠?qū)⑦B接改為管道方式的代理服務(wù)器。通常用于SSL加密服務(wù)器的鏈接與非加密的HTTP代理服務(wù)器的通信。
PATCH
PATCH方法出現(xiàn)的較晚,它在2010年的 RFC 5789 PATCH Method for HTTP 標(biāo)準(zhǔn)中被定義。PATCH請(qǐng)求與PUT請(qǐng)求類(lèi)似,同樣用于資源的更新。二者有以下兩點(diǎn)不同:
- 但PATCH一般用于資源的部分更新,而PUT一般用于資源的整體更新。
- 當(dāng)資源不存在時(shí),PATCH會(huì)創(chuàng)建一個(gè)新的資源,而PUT只會(huì)對(duì)已在資源進(jìn)行更新。
參考
- HTTP 權(quán)威指南
- RFC 7231, section 4: Request methods
- RFC 5789, section 2: Patch method
總結(jié)
以上是生活随笔為你收集整理的常见的HTTP Method深度解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 图的存储之链式前向星
- 下一篇: 正则表达式-匹配