关于 RESTful 幂等性,尤其是PUT,PATCH和DELETE

关于 RESTful 幂等性,尤其是PUT,PATCH和DELETE


查找 restful 的相关资料时,会产生这样一个疑问?

HTTP MethodIdempotentSafe
OPTIONSyesyes
HEADyesyes
GETyesyes
POSTnono
PUTyesno
PATCHnono
DELETEyesno

为 什 么 p u t 和 d e l e t e 是 幂 等 , 而 p a t c h 则 是 非 幂 等 的 ? \color{red}{为什么 put 和 delete 是幂等,而 patch 则是非幂等的?} putdeletepatch

这里前提是首先要了解 RESTful API http 动词含义

幂等概念:
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

通俗点说:重复发送同一个http请求多次,结果同发送一次。即不会产生任何副作用(数据资源的改变)。

这里举例子,以 flowers – 花 为资源实体进行说明:

 GET /flowers   #获取 花(flowers) 列表信息
 GET /flowers/1   #获取 某个具体的花(flowers) 列表详情

get【幂等】: 用于获取资源,无路是获取花的列表总信息还是某个具体的花的详情,不管调用多少次接口,返回结果总是保持不变的,不会改变任何资源。因为你没做任何改动操作,如:增、删、改。仅仅只是查询而已。

 POST /flowers   #新增 一种花(flowers) 的信息

post【非幂等】:用于创建资源,每次调用都会创建一个新的资源。理论上不会(实际也不应该,最起码存在主键)产生重复。每次调用都是新增一种花的信息,调用一次请求数据库就多了一种资源(resource)。

重 点 来 了 \color{red}{重点来了} ,put 和 patch 都是用于更新数据资源的。 区别 在于

put 做更新操作时候是提交一整个更新后的实体(即全部),而不是需要修改的实体中的部分属性。当 URI 指向一个存在的资源,服务器要做的事就是查找并替换。

patch 做更新操作的时候是请求中的实体是一组将要应用到实体的更改(即部分),而不是像 PUT 请求那样是要替换旧资源的实体。可以理解为:PATCH 请求中的实体保存的是修改资源的指令,该指令指导服务器来对资源做出修改。

怎么理解呢?要明白并理解 RESTful 核心就是 面向资源编程,如下:

 PUT /flowers/1   #修改 序号为1的花(flowers) 的全部信息

put【幂等】:用于更新资源,没有的话则执行创建操作。每次执行请求时都会先判断一下序号为1的花信息是否存在,不存在则创建,否则视为更新。很显然,请求携带的数据每次都是一样的,所以不论请求多少次,最终的结果都是后台存在这么一个资源(创建或更新)。

 PATCH /flowers/1/variety/lily/num/331   #假设url采用pathinfo模式,修改 序号为1的花(flowers) 的品种信息为百合,数量修改位431朵

patch【非幂等】:用于更新资源,即数据实体的一部分属性,该数据必然存在,否则失去更新意义。每次执行请求时都会先判断一下序号为1的花信息是否存在,存在则更新数据信息,这里有两个属性要改,做的处理可能是这样的:品种(variety)直接改为百合(lily),而数量(num)假设原本存在100朵,我们要修改到 431 朵,所以增加 331 朵。很显然,多次请求时,会重复增加 331 ,属性数量就无法保持 431 。而 PUT 请求不论执行多少次,属性数量永远都是 431 , PATCH 则会改变,处于不可控的地位,所以说 PUT 方法是幂等的,而 PATCH 方法不是幂等的。

 DELETE /flowers/1   #删除 序号为1的花(flowers) 的全部信息

delete【幂等】: 用于删除资源,会将资源从后台删除。每次执行请求时都会先判断一下序号为1的花信息是否存在,存在则删除,否则不做任何操作。很显然,无论执行多少次资源的状态总是被删除的,不会有其它副作用的影响。

这里额外要注意的一点是,资源是一个实体,所有请求时应当为名词形式,并且是复数格式。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值