HTTP请求的幂等性

作者:bibodeng 发布于:2017-3-13 8:58 Monday 分类:编程技术

HTTP的请求有许多种,而无外乎都是 增、删、改、查,和数据库是很类似的,服务器托管的资源,其实只需要这几个方法就覆盖绝大多数的需求了,它们分别对应 POST、DELETE、PUT、GET,然而它们的幂等性需要被重视,因为在开发中如果忽视了幂等性,则可能会在程序中留下漏洞。

以RESTful的现代API来看,一个URL后面对应的就是一个资源,对于这个资源会有以下操作:

  • POST 创建一个资源,非幂等
  • GET 获取这个资源,幂等
  • DELETE 删除这个资源,幂等
  • PUT 更新这个资源,幂等

所谓幂等,就是无论请求多少次,都和请求一次是一样的效果,这个幂等性不是HTTP请求方法自带的,而是开发者在编程的时候实现的,如果你希望它幂等,则每次都一样地处理类似的需求,如果你不希望它幂等,则需要做些额外处理,对,需要你处理。

方法幂等,我们也期待它幂等(GET,DELETE,PUT)的情况,GET毫无疑问,你读一个资源多少次,都是一样的结果;DELET一个资源成功后,再次DELETE应当什么也不做,这样无论做多少次,都只删除了这个资源一次,而PUT,我们也是直接更新这个资源,次数并不会产生影响。

比较特殊的是POST方法,某些情况下,我们可能不希望它每POST一次,都产生一个新的结果,故而我们需要额外处理,例如同样的注册过程,我提交了一次表单,注册了一个账号,同样的内容再提交一次,再注册一个账号,因为我们不允许多个相同账号,所以我们拒绝了。再比如,用户在处理一个表单提交时使用的是POST(提交订单[wait_pay]->确认支付[pay]),但是我们希望用户只保持一个wait_pay状态的资源实例,也即这一步提交后点一次刷新不应该再能提交成功,于是我们应该拒绝这样的多次请求,防止资源被创建多次。很多情况下,我们希望用户继续处理未完成的单据,则需要阻止POST的这种非幂等,除此之外,还要配套一个GET请求,让用户能够处理这种状态的资源,形成闭环。

标签: HTTP 幂等

发表评论:

Powered by emlog 京ICP备16017775