http 的post 和 get 方法確實(shí)很難區(qū)分,大多數(shù)的解釋都是,如果是新建一條記錄的話就用post,如果是更新一條記錄的話就用put,為什么呢?
POST
POST 方法被用于請求源服務(wù)器接受請求中的實(shí)體作為請求資源的一個新的從屬物
POST方法的實(shí)際功能是由服務(wù)器決定的,并且經(jīng)常依賴于請求URI(Request-URI)。POST提交的實(shí)體是請求URI的從屬物,就好像一個文件從屬于一個目錄,一篇新聞文章從屬于一個新聞組,或者一條記錄從屬于一個數(shù)據(jù)庫。POST方法執(zhí)行的動作可能不會對請求URI所指的資源起作用。在這種情況下,200(成功)或者204(沒有內(nèi)容)將是適合的響應(yīng)狀態(tài),這依賴于響應(yīng)是否包含一個描述結(jié)果的實(shí)體。如果資源被源服務(wù)器創(chuàng)建,響應(yīng)應(yīng)該是201(Created)并且包含一個實(shí)體,此實(shí)體描述了請求的狀態(tài)。并且引用了這個新資源和一個Location頭域。POST方法的響應(yīng)是不可緩存的。除非響應(yīng)里有合適的Cache-Control或者Expires頭域。然而,303(見其他)響應(yīng)能被用戶代理利用去獲得可緩存的響應(yīng)。
PUT
PUT方法請求服務(wù)器去把請求里的實(shí)體存儲在請求URI(Request-URI)標(biāo)識下。
如果請求URI(Request-URI)指定的的資源已經(jīng)在源服務(wù)器上存在,那么此請求里的實(shí)體應(yīng)該被當(dāng)作是源服務(wù)器關(guān)于此URI所指定資源實(shí)體的最新修改版本。如果請求URI(Request-URI)指定的資源不存在,并且此URI被用戶代理定義為一個新資源,那么源服務(wù)器就應(yīng)該根據(jù)請求里的實(shí)體創(chuàng)建一個此URI所標(biāo)識下的資源。如果一個新的資源被創(chuàng)建了,源服務(wù)器必須能向用戶代理(user agent) 發(fā)送201(已創(chuàng)建)響應(yīng)。如果已存在的資源被改變了,那么源服務(wù)器應(yīng)該發(fā)送200(Ok)或者204(無內(nèi)容)響應(yīng)。如果資源不能根據(jù)請求URI創(chuàng)建或者改變,一個合適的錯誤響應(yīng)應(yīng)該給出以反應(yīng)問題的性質(zhì)。實(shí)體的接收者不能忽略任何它不理解和不能實(shí)現(xiàn)的Content-*(如:Content-Range)頭域,并且必須返回501(沒有被實(shí)現(xiàn))響應(yīng)。如果請求穿過一個緩存(cache),并且此請求URI(Request-URI)指示了一個或多個當(dāng)前緩存的實(shí)體,那么這些實(shí)體應(yīng)該被看作是舊的。PUT方法的響應(yīng)是不可緩存的。
****************
POST方法和PUT方法請求最根本的區(qū)別是請求URI(Request-URI)的含義不同。POST請求里的URI 指示一個能處理請求實(shí)體的資源(譯注:此資源可能是一段程序,如jsp 里的servlet) 。此資源可能是一個數(shù)據(jù)接收過程,一個網(wǎng)關(guān)(gateway,注:網(wǎng)關(guān)和代理的區(qū)別是:網(wǎng)關(guān)可以進(jìn)行協(xié)議轉(zhuǎn)換,而代理不能,只是起代理的作用,比如緩存服務(wù)器其實(shí)就是一個代理),或者一個單獨(dú)接收注釋的實(shí)體。對比而言,PUT方法請求里的URI標(biāo)識請求里封裝的實(shí)體一一用戶代理知道URI 意指什么,并且服務(wù)器不能把此請求應(yīng)用于其它資源(resource)。如果服務(wù)器期望請求被應(yīng)用于一個不同的URI,那么它必須發(fā)送301(永久移動)響應(yīng);用戶代理可以自己決定是否重定向請求。一個單獨(dú)的資源可能會被許多不同的URI指定。如:一篇文章可能會有一個URI指定當(dāng)前版本,而這個URI區(qū)別于這篇文章其它特殊版本的URI。這種情況下,對一個通用URI的PUT請求可能會導(dǎo)致其資源的其它URI請求被源服務(wù)器重定義。HTTP/1.1沒有定義PUT方法對源服務(wù)器的狀態(tài)影響。
等冪方法(Idempotent Mehtods)
方法可以有等冪的性質(zhì)因?yàn)椋ǔ顺鲥e或終止問題)N>0個相同請求的副作用同單個請求的副作用的效果是一樣(譯注:等冪就是值不變性,相同的請求得到相同的響應(yīng)結(jié)果,不會出現(xiàn)相同的請求出現(xiàn)不同的響應(yīng)結(jié)果)。方法GET,HEAD,PUT,DELETE都有這種性質(zhì)。同樣,方法OPTIONS和TRACE不應(yīng)該有副作用,因此具有內(nèi)在的等冪性。然而,有可能有多個請求的請求序列是不等冪的,即使在那樣的序列中所有方法都是等冪的。(如果整個序列整體的執(zhí)行的結(jié)果總是相同的,并且此結(jié)果不會因?yàn)樾蛄械恼w,部分的再次執(zhí)行而改變,那么此序列是等冪的。)例如,一個序列是非等冪的如果它的結(jié)果依賴于一個值,此值在以后相同的序列里會改變。根據(jù)定義,一個序列如果沒有副作用,那么此序列是等冪的(假設(shè)在資源集上沒有并行的操作)。
相同的請求怎樣處理由我們服務(wù)器決定,比如:一個創(chuàng)建一篇博文的uri,被請求兩次時,假如我們的服務(wù)器認(rèn)為他們是不一樣的,那么這時就只能用post,而不能用put.
(注:本文大部分引用自《超文本傳輸協(xié)議-HTTP/1.1(修訂版)》)