REST|REST Style中的POST和PUT

REST风格使用HTTP协议原生的GET、PUT、POST、DELETE方法表示动作,其中PUT和POST方法的确切含义比较难以区分,本文就是要尝试区分这两种方式在语义和使用上的区别。
说在前面,这四种方法当然都可以实现彼此的功能,因为他们实际上只有名字上的区别,但作为严格规范的RESTful设计,还是应当适当明确语义,避免含糊。
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."
从上面的说明可以看到,POST方法用于创建,而PUT方法用于创建和更新。那么究竟应当用POST还是PUT来表示更新的语义。
如何区分两者 对于两者的更明确区分其实没有什么权威说法,在网络上可以看到非常多的争论,我个人倾向于以下两点(没有说别的看法不好的意思,对不起!)。
  • 【REST|REST Style中的POST和PUT】幂等性
    PUT方法在语义上具有幂等性,这是一个非常棒的特性,连续两次的相同PUT请求和只有一次请求得到的效果相同。PUT只是把Object放在那里,下一次放会自然地覆盖前一次。
  • PUT从语义上更倾向于指向一个明确的带有名称的资源
    PUT/user-report/fzwanPOST /user-report/

    PUT指向一个具体的ID或者名称,而POST不在URL中指定。
类似于PUT和POST应该如何使用的讨论实在太多了,甚至超出了它值得讨论的范畴(胡说的,对不起!),我认为在实际使用中只要注意无歧义,相对合适地使用就很好了,倒也不必纠缠过多。

    推荐阅读