接口幂等性问题
描述
接口幂等性是软件开发时常见的问题,其目的是要求确保当同一个接口被重复调用时其状态不会发生变化
示例
当前一个支付页面,不管用户在同一时间内点击多少次支付按钮,最终接口也只会生成一个支付订单,这就是接口幂等性
解决方案
- 前端限制用户提交:
- 例如Vue中的
.once
,其根本原理就是在一个时间段内用户的按钮事件只会触发一次提交 - 这个方案并不完善,因为该限制在页面刷新后就会失效
- 例如Vue中的
- 数据库唯一标识:
- 为每个支付订单创建唯一的流水号
- 在提交时优先校验流水号是否已存在
- 如存在则不提交,反之提交
- Token机制:
- 在调用支付接口前先在用户访问时后端生成随机字符串并存到
redis
,这个随机字符串会返回到前端 - 需要用户在调用支付接口时请求头携带此token。
- 如果调用支付接口时请求头中的token跟
redis
中的一致则删除redis
中的token,否则就意味着这是用户在重复调用接口
- 在调用支付接口前先在用户访问时后端生成随机字符串并存到
- 乐观锁:
- 引入版本号概念
- 首先在用户调用接口时先校验携带的版本号和数据库中的版本号是否一致
- 如果一致则版本号+1,这样下次调用无论如何版本号也不会一致,后续操作也不会执行
- 除非后端再次将版本号返回给前端