Http之POST PUT

Posted Programming World

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Http之POST PUT相关的知识,希望对你有一定的参考价值。

今天来探讨下POST和PUT方法,在平常写Rest API时,只知道POST通常应用于创建数据,PUT应用于创建或更改数据。但二者之间还是有很大的区别。下面通过对POST和PUT的概念进行分析,并给出一些实例。


POST和PUT方法我们不去通过创建或者更改来区分,而是通过一个概念Idempotent进行区分。Idempotent的定义是:

Idempotence is the property of certain operations in mathematics and computer science, that can be applied multiple times without changing the result beyond the initial application.


也就是说一个方法多次调用结果相同,则是Idempotent。实际上POST不是idempotent,而PUT方是idempotent。我们来分析一下以下案例。

按照我现在给学生讲的一个例子,我们有一个Person表在数据库中,通过Rest API实现Crud。


现在有这样一个API: /api/person,并且request body中是Person的JSON对象,该api想要在/api/person下添加一个Person对象。此时我们必须用POST方法,因为每次调用该api产生的结果不相同。比如两次调用该API,并且第一次Person的id是1,第二次是2,在调用GET API时,需要按照以下方式分别获取Person对象:GET /api/person/1, GET /api/person/2。我们在/api/person下创建了两个subordinate或者说child。两次调用的api结果并不相同。


我们现在来考虑下面这个API:/api/person/{id},并且request body中是Person的JSON对象,该api想要在/api/person下添加一个Person对象。那么该API必须通过PUT方法调用,因为多次调用该API的结果相同。如果/api/person下这个id存在,则更改位于/api/person/{id}中的数据。如果不存在则在/api/person下创建这个Person对象。也就是说,不管调用多少次,我们一直在和/api/person/{id}打交道,因此通过GET /api/person/{id}我们很明确地能得出刚创建的结果。

下面是Controller中定义的这些API,只是一个demo:


我们再给出一个类似的例子:

GET /bank/accounts/{account-id}

POST /bank/accounts

PUT /bank/accounts/{account-id}


整篇文章我都早避免使用创建或修改字眼,而是通过idempotent来区分POST和PUT的区别。


以上是关于Http之POST PUT的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS $http 之 POST 传参

Http之POST PUT

php之curl实现http请求(支持GET和POST)

http之100-continue(转)

http之post方法 提交数据的四种方法

HTTP请求方式之GET和POST比较