正常RESTful風格的應用支持以下四種HTTP操作:
GET: 查詢
POST: 新增。
PUT: 修改。
DELETE: 刪除
其中PUT和DELETE,天生滿足冪等性。而POST本身是非冪等的,如果要滿足冪等性,比如防止客戶在頁面連續點擊了多次提交按鈕去數據庫插入數據,需要我們程序自己去設計,來防止同一份數據在數據庫存了多條。比如可以使用提交的數據攜帶token的方式,如果發現token相同,則不重複處理。
WEB開發
正常WEB開發時,按說如果設計成RESTful風格,那上面四種操作都會使用。但是由於各種歷史原因,或者有的老版本瀏覽器或者應用服務器(比如Tomcat)對PUT和DELETE支持的不夠好,應用頁面一般還是使用GET和POST兩種方式提交HTTP請求比較多:用GET讀,用POST寫(包含增、刪、改)。
ElasticSearch API
ES的API雖然號稱也是RESful風格的,但是根WEB開發常用的還是不太一樣。
ES裏post幾種應用場景:
1). 新增(不指定doc id),比如:
POST student/_doc
{
"name": "Kevin",
"AGE": 22
}
ES 會自動幫助你生成一個id
2)修改文檔部分內容,比如:
POST student/_doc/tNVExG4BPVlby6t3Hx1i/_update
{
"doc": {
"name": "Kevin zhang"
}
}
3)替換已有的文檔
先查詢:
GET student/_doc/tNVExG4BPVlby6t3Hx1i
{
"_index": "student",
"_type": "_doc",
"_id": "tNVExG4BPVlby6t3Hx1i",
"_version": 23,
"found": true,
"_source": {
"name": "Kevin zhang",
"AGE": 22
}
}
替換:
POST student/_doc/tNVExG4BPVlby6t3Hx1i
{
"name": "tom tian",
"AGE": 23,
"sex": "male"
}
再查:
GET student/_doc/tNVExG4BPVlby6t3Hx1i
{
"_index": "student",
"_type": "_doc",
"_id": "tNVExG4BPVlby6t3Hx1i",
"_version": 24,
"found": true,
"_source": {
"name": "tom tian",
"AGE": 23,
"sex": "male"
}
}
ES裏PUT有幾種應用場景
1) 新增:
a) 新增index (順便可以帶上index map結構),比如
PUT /student
{
"mappings": {
"_doc":{
"properties":{
"name":{
"type":"text"
},
"age":{
"type":"short"
}
}
}
}
}
b) 新增document, 但是必須手工指定id,否則執行不成功,比如:
put student/_doc/1
{
"name": "John Wang",
"age": 24
}
GET student/_doc/1
{
"_index": "student",
"_type": "_doc",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"name": "John Wang",
"age": 24
}
}
c) 替換已有文檔,這點和POST一樣,需要指定文檔id。只是put沒有post那樣更新部分文檔字段的功能。
ES 的DELETE和GET操作
這個沒有什麼特別的,DELETE操作就是刪除,GET就是查詢。
綜上,在ES裏邊, post和put都可以實現新增功能,也都可以實現更新功能(替換也算是一種更新),只是post可以實現部分更新。