REST風(fēng)格使用HTTP協(xié)議原生的GET障本、PUT教届、POST、DELETE方法表示動(dòng)作彼绷,其中PUT和POST方法的確切含義比較難以區(qū)分巍佑,本文就是要嘗試區(qū)分這兩種方式在語(yǔ)義和使用上的區(qū)別。
說(shuō)在前面寄悯,這四種方法當(dāng)然都可以實(shí)現(xiàn)彼此的功能萤衰,因?yàn)樗麄儗?shí)際上只有名字上的區(qū)別,但作為嚴(yán)格規(guī)范的RESTful設(shè)計(jì)猜旬,還是應(yīng)當(dāng)適當(dāng)明確語(yǔ)義脆栋,避免含糊倦卖。
HTTP/1.1 Spec
The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line
The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI."
從上面的說(shuō)明可以看到,POST方法用于創(chuàng)建椿争,而PUT方法用于創(chuàng)建和更新怕膛。那么究竟應(yīng)當(dāng)用POST還是PUT來(lái)表示更新的語(yǔ)義。
如何區(qū)分兩者
對(duì)于兩者的更明確區(qū)分其實(shí)沒(méi)有什么權(quán)威說(shuō)法秦踪,在網(wǎng)絡(luò)上可以看到非常多的爭(zhēng)論褐捻,我個(gè)人傾向于以下兩點(diǎn)(沒(méi)有說(shuō)別的看法不好的意思,對(duì)不起R蔚恕)柠逞。
冪等性
PUT方法在語(yǔ)義上具有冪等性,這是一個(gè)非常棒的特性景馁,連續(xù)兩次的相同PUT請(qǐng)求和只有一次請(qǐng)求得到的效果相同板壮。PUT只是把Object放在那里,下一次放會(huì)自然地覆蓋前一次合住。-
PUT從語(yǔ)義上更傾向于指向一個(gè)明確的帶有名稱(chēng)的資源
PUT /user-report/fzwan POST /user-report/
PUT指向一個(gè)具體的ID或者名稱(chēng)绰精,而POST不在URL中指定。
類(lèi)似于PUT和POST應(yīng)該如何使用的討論實(shí)在太多了透葛,甚至超出了它值得討論的范疇(胡說(shuō)的笨使,對(duì)不起!)获洲,我認(rèn)為在實(shí)際使用中只要注意無(wú)歧義阱表,相對(duì)合適地使用就很好了,倒也不必糾纏過(guò)多贡珊。