Mark一下:HTTP协议中PUT和POST动作的区别
(这篇文章排版好乱,但是懒癌发作的我现在暂时不想管了……_(:з」∠)_)
这个算是HTTP协议中最最最最基本的概念之一了吧,但是今天才意识到原来之前一直没有彻底搞懂过。(当然我觉得虽然现在比之前理解多一点了,但是还没有彻彻底底搞明白orz...)
所以啊,为了长点记性,还是记录一下吧。
之前自己对PUT和POST这两个动作的理解呢,只停留在“PUT用来更新资源,POST用来创建资源”这种浅显又有问题的认知上。
其实PUT和POST都可以用来创建和更新资源,他们俩最大的区别就是,PUT是“幂等”(idempotent)的,POST不是。→P.S. 到底什么是“幂等”这个我还没仔细去研究过,所以这里就不误人子弟了。有兴趣的可以自己研究一下~~或者等我哪天懒癌没有发作了说不定会再补充上来!ヽ( ̄▽ ̄)و
那么问题来了,有了“幂等”这个属性的加持,PUT操作和POST操作会产生什么区别?
(请先思考30秒,大胆推测一下!(๑*◡*๑))
.
.
.
.
.
.
公布“答案”(我自己的理解):对于相同资源,如果对同一资源反复进行PUT操作,是服务器是不会创建新的资源的,而是找到原有资源后去更新它。但是POST则会在每次提交后,无视之前的资源,创建新的资源。
那么问题又来了,既然PUT和POST作用都差不多,对于web开发新手来说,到底应该选择哪种动作去更新资源或者创建资源??
(这个问题比刚才的难,请思考久一点ヾ(๑╹◡╹)ノ")
.
.
.
.
.
.
解释这个问题前,先看下比较权威的说明(When should we use PUT and when should we use POST?):
Use PUT when you can update a resource completely through a specific resource. For instance, if you know that an article resides at http://example.org/article/1234, you can PUT a new resource representation of this article directly through a PUT on this URL.
当您可以完全更新已知的特定资源时,请使用PUT操作。例如,如果您知道一篇文章位于http://example.org/article/1234,那么您可以通过PUT操作直接将这篇文章新的资源表示放置到对应的URL(即http://example.org/article/1234)上。
If you do not know the actual resource location, for instance, when you add a new article, but do not have any idea where to store it, you can POST it to an URL, and let the server decide the actual URL.
如果您不知道实际的资源位置,例如,当您准备添加一篇新文章,但是不知道在具体要在哪里存储它,那么您可以将它POST到一个(大概的)URL,并让服务器决定它实际(具体)的URL。
上面这段文字如果不是很好理解的话,那我换个我自己理解后的表达来尝试解释一下:
因为PUT和POST都可以用来“创建”或者“更新”资源,所以我们先将这两个动作分开来分析,先说创建好了。
如果你现在想发表一篇新文章,名字叫“Apple”,然后你明确的知道你的这篇文章发表后,可以访问到它的地址应该是 http://myarticle.com/article/apple ,那么你就可以使用PUT的方式,将你新发表的文章创建到 http://myarticle.com/article/apple 这个路径下;
但是如果现在你只知道你要发表的文章应该被放到 http://myarticle.com/article/ 这个路径下的某个位置,具体文章会被编号成什么你一点概念都没有,那你还是选择POST方式吧,将文章POST到 http://myarticle.com/article/ 这个路径下,然后让服务器来告诉你创建好的新文章可访问的路径到底是什么。
说完创建,更新也就好理解很多了。如果更新某个资源的时候,你知道这个资源的具体所在路径,那么就可以使用PUT方法,来用新资源完全替换掉原来的资源。而POST方法嘛,自然就是在你不清楚你目前要更新的这个路径具体在什么位置,你只知道它大概在什么位置的时候使用。服务器会在接收到POST上来的资源的时候,在你给的大致路径中创建好这个资源的新的访问路径,然后把这个路径返回给你,对于不需要关心服务器中具体发生了什么的客户端来说,最终达到的效果也是“更新”了原有的资源。
综上,绕了一大圈其实又回到了最初的“PUT(通常)用来更新资源,POST(一般)用来创建资源”这一认知上,不过现在比之前好一点,至少明白了为什么PUT大多会用来更新资源,POST会经常用于创建资源了。