(這篇文章排版好亂,可是懶癌發做的我如今暫時不想管了……_(:з」∠)_)web
這個算是HTTP協議中最最最最基本的概念之一了吧,可是今天才意識到原來以前一直沒有完全搞懂過。(固然我以爲雖然如今比以前理解多一點了,可是尚未不折不扣搞明白orz...)服務器
因此啊,爲了長點記性,仍是記錄一下吧。app
以前本身對PUT和POST這兩個動做的理解呢,只停留在「PUT用來更新資源,POST用來建立資源」這種淺顯又有問題的認知上。ide
其實PUT和POST均可以用來建立和更新資源,他們倆最大的區別就是,PUT是「冪等」(idempotent)的,POST不是。→P.S. 到底什麼是「冪等」這個我還沒仔細去研究過,因此這裏就不誤人子弟了。有興趣的能夠本身研究一下~~或者等我哪天懶癌沒有發做了說不定會再補充上來!ヽ( ̄▽ ̄)وpost
那麼問題來了,有了「冪等」這個屬性的加持,PUT操做和POST操做會產生什麼區別?this
(請先思考30秒,大膽推測一下!(๑*◡*๑))idea
.spa
.rest
.server
.
.
.
公佈「答案」(我本身的理解):對於相同資源,若是對同一資源反覆進行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會常常用於建立資源了。