PUT是冪等方法,而POST並不是。
PUT用於更新操作,POST用於新增操作比較合適。
PUT,DELETE操作是冪等的,所謂冪等就是指不管進行多少次操作,結果都一樣。
比如,我用PUT修改一篇文章,然后在做同樣的操作,每次操作后的結果並沒有不同,DELETE也是一樣。
POST操作不是冪等,比如常見的POST重復加載問題:當我們多次發出同樣的POST請求后,其結果是創建出了若干的資源。
還有一點需要注意的是,創建操作可以使用POST,也可以使用PUT。區別在於POST是作用在一個集合資源之上的(/articles),而PUT操作是作用在一個具體資源之上的(/articles/123),比如說很多資源使用數據庫自增主鍵作為標識信息,而創建的資源的標識信息到底是什么只能由服務端提供,這個時候就必須使用POST。
[hadoop@master elasticsearch-2.4.0]$ curl -XPOST http://master:9200/zhouls/user/1 -d '{"name" : "john" , "age" : 28}' {"_index":"zhouls","_type":"user","_id":"1","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}[hadoop@master elasticsearch-2.4.0]$ [hadoop@master elasticsearch-2.4.0]$
zhouls是索引,user是類型,1是id
[hadoop@master elasticsearch-2.4.0]$ curl -XPOST http://master:9200/zhouls/user -d '{"name" : "john"}' {"_index":"zhouls","_type":"user","_id":"AVz5Q9u7U8bDb6QDgbDS","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}[hadoop@master elasticsearch-2.4.0]$ [hadoop@master elasticsearch-2.4.0]$
zhouls是索引,user是類型
由此,可見,如果,我們不指定id,則會自動隨機生成
POST方式是自增id,PUT是必須要跟上id。
[hadoop@master elasticsearch-2.4.0]$ curl -XPUT http://master:9200/zhouls/user/2?op_type=create -d '{"name" : "john" , "age" : 28}' {"_index":"zhouls","_type":"user","_id":"2","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}[hadoop@master elasticsearch-2.4.0]$ [hadoop@master elasticsearch-2.4.0]$
zhouls是索引,user是類型,2是id,
?op_type=create是
[hadoop@master elasticsearch-2.4.0]$ curl -XPUT http://master:9200/zhouls/user/2/_create -d '{"name" : "john" , "age" : 28}' {"error":{"root_cause":[{"type":"document_already_exists_exception","reason":"[user][2]: document already exists","index":"zhouls","shard":"2"}],"type":"document_already_exists_exception","reason":"[user][2]: document already exists","index":"zhouls","shard":"2"},"status":409}[hadoop@master elasticsearch-2.4.0]$ [hadoop@master elasticsearch-2.4.0]$
zhouls是索引,user是類型,2是id,
_create是
由此,可見,PUT是不允許,已經創建過的id,再來創建。
[hadoop@master elasticsearch-2.4.0]$ [hadoop@master elasticsearch-2.4.0]$ curl -XPUT http://master:9200/zhouls/user/3/_create -d '{"name" : "john" , "age" : 28}' {"_index":"zhouls","_type":"user","_id":"3","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}[hadoop@master elasticsearch-2.4.0]$ [hadoop@master elasticsearch-2.4.0]$ [hadoop@master elasticsearch-2.4.0]$