HTTP PUT and POST

POST 方法用来传输实体的主体,PUT方法用来传输文件。

两个方法都是将一个资源附加到服务器端的请求。一些狭窄的意见认为,POST方法用来创建资源,而PUT方法则用来更新资源。这个说法本身没有问题,但是并没有从根本上解释了二者的区别。事实上,它们最根本的区别就是:POST方法不是幂等的,而PUT方法则有幂等性。

幂等(idempotent、idempotence)是一个抽象代数的概念。在计算机中,可以这么理解,一个幂等操作的特点就是其任意多次执行所产生的影响均与依次一次执行的影响相同。

POST在请求的时候,服务器会每次都创建一个文件,但是在PUT方法的时候只是简单地更新,而不是去重新创建。因此PUT是幂等的。

举例,有一个博客系统提供一个Web API,模式是这样http://example.com/blogs/post/{blog-name},很简单,将{blog-name}替换为我们的blog名字,往这个URI发送一个HTTP PUT或者POST请求,HTTP的body部分就是博文,这是一个很简单的REST API例子。

用PUT方法还是POST方法?取决于这个REST服务的行为是否是idempotent的,假如我们发送两个http://example.com/blogs/post/Sample请求,服务器端是什么样的行为?如果产生了两个博客帖子,那就说明这个服务不是idempotent的,因为多次使用产生了副作用了嘛;如果后一个请求把第一个请求覆盖掉了,那这个服务就是idempotent的。前一种情况,应该使用POST方法,后一种情况,应该使用PUT方法。

如果用PUT来达到更改资源,每次请求需要client提交资源全部信息,如果只有部分信息,不应该使用PUT(因为服务器使用client提交的对象整体替换服务器的资源)。

POST不同于一般的增删改,使用场景比较多。根据RFC文档上描述,有以下几个场景:(tools.ietf.org/html/rfc

- Annotation of existing resources;

- Posting a message to a bulletin board, newsgroup, mailing list, or   
  similar group of articles;

- Providing a block of data, such as the result of submitting a
  form, to a data-handling process;

- Extending a database through an append operation.

服务器在实现POST是不可预知,所以将其定义为不安全、不幂等的Verb。基本上不能简单的归纳为“增删改”之类的行为,都可以使用POST方法。

 

 

此条目发表在technologys分类目录。将固定链接加入收藏夹。