在学习Elastic Search的时候注意到,当我们去索引一个指定id的新文档时请求用PUT方式,如
1 | PUT /website/blog/123 |
而索引一个自动分配id的新文档时就使用POST方式,如
1 | POST /website/blog/ |
同样是新建一个文档,为什么要使用不同的方式呢?
之前感觉post和put没有什么区别,大致区分为新建和更新资源操作。
实际上在HTTP中,PUT被定义为幂等的方法,POST则不是,这是一个很重要的区别。
HTTP 幂等方法是指无论调用多少次都不会有不同结果的 HTTP 方法。它无论是调用一次,还是十次都无关紧要。结果仍应相同。再次强调, 它只作用于结果而非资源本身。它仍可能被操纵(如一个更新的 timestamp),提供这一信息并不影响(当前)资源的表现形式。
如:
1 | a = 4; // 幂等 |
所以如果一个操作是幂等的,就用put方式请求,否则用post。
elastic search的新建操作中,第一种用put方式指定了id进行新建,每次请求都只有id为123的新资源,是幂等的(多次新建为更新),而第二种post方式不指定id,es会为新资源分配一个唯一的id,如果再次请求就会又生成一个不同id的新资源,所以是不幂等的。
这两个方式本质没有什么区别,只是协议不同,用错了也不会有大问题,请求还是会被正确处理,但是如果我们如果不遵从HTTP协议的规范,可能会影响SEO或其他麻烦也是不值得的,还是好好遵守协议叭~