HTTP中Method含義與區(qū)別

HTTP/1.1包含GET HEAD POST OPTIONS PUT DELETE TRACE CONNECT這8個(gè)方法

  1. 安全方法(Safe Methods)是指用戶(hù)不管進(jìn)行多少次操作,資源的狀態(tài)都不會(huì)改變。比如說(shuō),GET和HEAD方法僅能獲取資源,而不會(huì)執(zhí)行動(dòng)作(action),這些方法屬于“安全”的方法。
    而POST,PUT,DELETE方法改變了資源的狀態(tài),可能會(huì)執(zhí)行不安全的動(dòng)作,使用者應(yīng)該意識(shí)到這一點(diǎn)。

  2. 冪等(Idempotent Methods)是數(shù)學(xué)的一個(gè)用語(yǔ),對(duì)于單個(gè)輸入或者無(wú)輸入的運(yùn)算方法,如果每次都是同樣的結(jié)果,則稱(chēng)其是冪等的。方法GET,HEAD,PUT,DELETE都有這種性質(zhì)。POST方法不是冪等的,比如常見(jiàn)的POST重復(fù)加載問(wèn)題:當(dāng)我們多次發(fā)出同樣的POST請(qǐng)求后,其結(jié)果是創(chuàng)建出了若干的資源。

  3. Option方法是指,對(duì)一個(gè)已有的request/response chain,請(qǐng)求URI指定資源的選項(xiàng)信息。這種方法的響應(yīng)是不能緩存的。請(qǐng)求URI中是否帶"*"(星號(hào))決定了請(qǐng)求應(yīng)用于服務(wù)器的所有資源還是特定資源。

  4. GET方法意思是獲取被請(qǐng)求URI(Request-URI)指定的信息,該信息以實(shí)體的型式呈現(xiàn)。如果請(qǐng)求URI指向的是一個(gè)數(shù)據(jù)生成過(guò)程,那么這個(gè)生成的數(shù)據(jù)應(yīng)該作為一個(gè)實(shí)體在響應(yīng)中返回。GET請(qǐng)求的響應(yīng)是可緩存的。

  5. HEAD方法和GET方法一致,區(qū)別在于HEAD方法不需要服務(wù)器在響應(yīng)里返回消息主體。HEAD請(qǐng)求響應(yīng)里HTTP頭域里的元信息應(yīng)該和GET請(qǐng)求響應(yīng)里的元信息一致。此方法被用來(lái)獲取請(qǐng)求實(shí)體的元信息,而不需要傳輸實(shí)體主體(entity-body)。此方法經(jīng)常被用來(lái)測(cè)試超文本鏈接的有效性,可訪(fǎng)問(wèn)性,和最近的改變。HEAD請(qǐng)求的響應(yīng)是可緩存的。

  6. POST方法:給源服務(wù)器一個(gè)請(qǐng)求,源服務(wù)器接受這個(gè)請(qǐng)求中的實(shí)體,然后可以將其作為資源的一部分。POST方法的實(shí)際功能是由服務(wù)器決定的,并且經(jīng)常依賴(lài)于請(qǐng)求URI(Request-URI)。POST方法提交的實(shí)體是請(qǐng)求URI的從屬物,就好像一個(gè)文件從屬于一個(gè)目錄,一篇新聞文章從屬于一個(gè)新聞組,或者一條記錄從屬于一個(gè)數(shù)據(jù)庫(kù)
    POST方法執(zhí)行的動(dòng)作可能不會(huì)對(duì)請(qǐng)求URI所指的資源起作用。在這種情況下,200(成功)或者204(沒(méi)有內(nèi)容)將是適合的響應(yīng)狀態(tài),這取決于響應(yīng)是否包含一個(gè)描述結(jié)果的實(shí)體。如果資源被源服務(wù)器創(chuàng)建,響應(yīng)應(yīng)該是201(Created)并且包含一個(gè)實(shí)體,此實(shí)體描述了請(qǐng)求的狀態(tài)并且此實(shí)體引用了一個(gè)新資源和一個(gè)Location頭域。
    POST方法的響應(yīng)是可緩存的。除非響應(yīng)里有Cache-Control或者Expires頭域指示其響應(yīng)不可緩存。而303響應(yīng)能指導(dǎo)用戶(hù)獲得可緩存的響應(yīng)。

  7. PUT方法:請(qǐng)求服務(wù)器把請(qǐng)求里包含的實(shí)體存儲(chǔ)在請(qǐng)求URI(Request-URI)標(biāo)識(shí)下。如果請(qǐng)求URI(Request-URI)指定的的資源已經(jīng)在源服務(wù)器上存在,那么此請(qǐng)求里的實(shí)體應(yīng)該被當(dāng)作是源服務(wù)器在此URI所指定資源實(shí)體的修改版本。如果請(qǐng)求URI(Request-URI)指定的資源不存在,并且此URI被用戶(hù)代理定義為一個(gè)新資源,那么源服務(wù)器就應(yīng)該根據(jù)請(qǐng)求里的實(shí)體創(chuàng)建一個(gè)此URI所標(biāo)識(shí)下的資源。如果一個(gè)新的資源被創(chuàng)建了,源服務(wù)器必須能向用戶(hù)代理發(fā)送201(已創(chuàng)建)響應(yīng)。如果已存在的資源被改變了,那么源服務(wù)器應(yīng)該發(fā)送200(Ok)或者204(無(wú)內(nèi)容)響應(yīng)。如果資源不能根據(jù)請(qǐng)求URI創(chuàng)建或者改變,應(yīng)該給出一個(gè)合適的錯(cuò)誤響應(yīng)來(lái)反應(yīng)問(wèn)題的性質(zhì)。實(shí)體的接收者不能忽略任何它不理解的Content-*(如:Content-Range)頭域,并且必須返回501(沒(méi)有被實(shí)現(xiàn))響應(yīng)。PUT方法的響應(yīng)不應(yīng)該被緩存。

  8. POST方法PUT方法最根本的區(qū)別在于,請(qǐng)求URI(Request-URI)的含義不同。POST請(qǐng)求里的URI指示的是一個(gè)能處理請(qǐng)求實(shí)體的資源(可能是一段程序,如jsp里的servlet)。而PUT方法請(qǐng)求里有一個(gè)實(shí)體,而且用戶(hù)代理知道URI意指什么,并且服務(wù)器不能把此請(qǐng)求應(yīng)用于其他URI指定的資源。如果服務(wù)器期望請(qǐng)求被應(yīng)用于一個(gè)不同的URI,那么它必須發(fā)送301(永久移動(dòng)了)響應(yīng);用戶(hù)代理可以自己決定是否重定向請(qǐng)求。

  9. DELETE方法請(qǐng)求源服務(wù)器刪除請(qǐng)求URI指定的資源。客戶(hù)端不能保證此操作能被執(zhí)行,即使源服務(wù)器返回成功狀態(tài)碼。服務(wù)器打算刪除資源或把此資源移到一個(gè)不可訪(fǎng)問(wèn)的位置時(shí)返回成功。如果響應(yīng)里包含描述成功的實(shí)體,響應(yīng)應(yīng)該是200(Ok);如果DELETE動(dòng)作沒(méi)有通過(guò),應(yīng)該以202(已接受)響應(yīng);如果DELETE方法請(qǐng)求已經(jīng)通過(guò)了,但響應(yīng)不包含實(shí)體,那么應(yīng)該以204(無(wú)內(nèi)容)響應(yīng)。DELETE方法的響應(yīng)是不能被緩存的。

  10. TRACE方法被用于激發(fā)一個(gè)遠(yuǎn)程的應(yīng)用層的請(qǐng)求消息回路。最后的接收者或者是接收請(qǐng)求里Max-Forwards頭域值為0源服務(wù)器或者是代理服務(wù)器或者是網(wǎng)關(guān)。TRACE請(qǐng)求不能包含一個(gè)實(shí)體。TRACE方法允許客戶(hù)端知道請(qǐng)求鏈的另一端接收什么,并且利用那些數(shù)據(jù)去測(cè)試或診斷。Via頭域值有特殊的用途,因?yàn)樗梢宰鳛檎?qǐng)求鏈的跟蹤信息。利用Max-Forwards頭域允許客戶(hù)端限制請(qǐng)求鏈的長(zhǎng)度去測(cè)試一串代理服務(wù)器是否在無(wú)限回路里轉(zhuǎn)發(fā)消息。如果請(qǐng)求是有效的,響應(yīng)應(yīng)該在響應(yīng)實(shí)體主體里包含整個(gè)請(qǐng)求消息,并且響應(yīng)應(yīng)該包含一個(gè)Content-Type頭域值為”message/http”的頭域。TRACE方法的響應(yīng)不能不緩存。

  11. HTTP1.1協(xié)議規(guī)范保留了CONNECT方法,此方法是為了能用于能動(dòng)態(tài)切換到隧道的代理服務(wù)器(proxy)。

推薦閱讀:RESTful API 設(shè)計(jì)指南

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • API定義規(guī)范 本規(guī)范設(shè)計(jì)基于如下使用場(chǎng)景: 請(qǐng)求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請(qǐng)求頻率非常高,建議使用雙通...
    有涯逐無(wú)涯閱讀 2,586評(píng)論 0 6
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,868評(píng)論 18 139
  • 前言 HTTP Method的歷史: HTTP 0.9 這個(gè)版本只有GET方法 HTTP 1.0 這個(gè)版本有G...
    老馬的春天閱讀 25,996評(píng)論 3 9
  • 8. 方法定義(Method Definitions) 通用的HTTP/1.0的方法集將在下面定義,雖然該方法集可...
    Palomar閱讀 3,209評(píng)論 0 2
  • 內(nèi)容只是引子,引出被未知域阻斷的相逢, 他們?cè)诓煌I(lǐng)域里,用不同形式的內(nèi)容,把人們最大范圍的鏈接起來(lái),成為彼此的美...
    Vickiy閱讀 318評(píng)論 0 0