正常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都可以实现新增功能,也都可以实现更新功能(替换也算是一种更新)。区别是:
1. post可以实现部分更新。
2. put 不管是新增或更新,都必须携带id。put带上id,如果已存在有相同id的document,则是更新操作。如果没有,则是新增操作。
3. 而post则可带可不带,如果post带上id,如果已存在有相同id的document,则更新, 如果没有,则新增。如果post不带id,则永远是新增,所以post不满足幂等性。
3. 因为put必须携带ID,所以他保证了幂等性,而post由于不带id时,