[碎片]HTTP 的post和put方式区别

在学习Elastic Search的时候注意到,当我们去索引一个指定id的新文档时请求用PUT方式,如

1
2
3
4
5
6
PUT /website/blog/123
{
"title": "My first blog entry",
"text": "Just trying this out...",
"date": "2014/01/01"
}

而索引一个自动分配id的新文档时就使用POST方式,如

1
2
3
4
5
6
POST /website/blog/
{
"title": "My second blog entry",
"text": "Still trying this out...",
"date": "2014/01/01"
}

同样是新建一个文档,为什么要使用不同的方式呢?

之前感觉post和put没有什么区别,大致区分为新建和更新资源操作。

实际上在HTTP中,PUT被定义为幂等的方法,POST则不是,这是一个很重要的区别。

HTTP 幂等方法是指无论调用多少次都不会有不同结果的 HTTP 方法。它无论是调用一次,还是十次都无关紧要。结果仍应相同。再次强调, 它只作用于结果而非资源本身。它仍可能被操纵(如一个更新的 timestamp),提供这一信息并不影响(当前)资源的表现形式。

如:

1
2
a = 4; // 幂等
a++; //非幂等,每次请求返回结果都不同

所以如果一个操作是幂等的,就用put方式请求,否则用post。

elastic search的新建操作中,第一种用put方式指定了id进行新建,每次请求都只有id为123的新资源,是幂等的(多次新建为更新),而第二种post方式不指定id,es会为新资源分配一个唯一的id,如果再次请求就会又生成一个不同id的新资源,所以是不幂等的。

这两个方式本质没有什么区别,只是协议不同,用错了也不会有大问题,请求还是会被正确处理,但是如果我们如果不遵从HTTP协议的规范,可能会影响SEO或其他麻烦也是不值得的,还是好好遵守协议叭~