6种方法轻松搞定接口幂等性

什么是接口幂等性?

首先看看幂等性的概念:
幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。
比如下面这些情况,如果没有实现接口幂等性会有很严重的后果:支付接口,重复支付会导致多次扣钱 ;订单接口,同一个订单可能会多次创建。

为什么会产生接口幂等性问题?

●网络波动,,可能会引起重复请求
●使用了失效或超时重试机制(Nginx重试、RPC重试或业务层重试等)
●页面重复刷新
●使用浏览器后退按钮重复之前的操作,导致重复提交表单
●用户双击提交按钮
如果说进行归类就只有两种场景:
●1.前端调用
●2.其他服务调用

如何保证接口幂等性?

针对调用场景,可以分为前端处理,后端校验处理。

1.前端调用

页面控制

点击之后按钮置灰或者是加载中,避免让用户重复点击多次,生成相同的数据。

使用Post/Redirect/Get模式

PRG模式的主要目的是避免在用户刷新页面时重新提交表单数据,从而避免重复提交的问题。通过重定向,可以将用户从一个处理请求的页面导向到另一个展示结果的页面,保持了用户体验的一致性。
使用PRG模式的关键是将表单提交的处理和重定向分离开来。服务器端在处理表单提交后,将重定向的URL作为响应返回给客户端,由客户端进行跳转。这样可以确保当用户刷新页面时,浏览器只会发送GET请求,而不会再次提交POST请求

token机制

功能上允许重复提交,但要保证重复提交不产生副作用,比如点击n次只产生一条记录,客户端每次请求都需要携带一个唯一的Token,而服务器则验证这个Token的有效性。如果服务器收到了一个已经使用过的Token,就会认为这是一个重复请求并拒绝处理,从而确保接口的幂等性。
Token机制是一种常用的方法,用于确保接口的幂等性和防止重复请求。具体流程如下:
●客户端发送请求到服务器。
●服务器在响应中返回一个Token给客户端。这个Token可以是一个随机生成的字符串或者其他唯一标识符。
●客户端在后续的请求中携带这个Token,可以作为请求参数或者放在请求头中。
●服务器在接收到请求时,首先验证Token的有效性。
●如果Token有效,说明是一个合法的请求,服务器进行正常处理。
●如果Token无效,说明可能是一个重复请求,服务器拒绝处理,并返回错误响应

2.后端校验处理

在接口的处理逻辑中,通过一些特定的标识符或请求参数来校验请求的幂等性,以确保同样的请求不会被重复处理。

1唯一标识符

在每次请求中,客户端可以生成一个唯一的标识符,并将其作为请求的一部分发送到服务器。服务器在接收到请求时,首先检查该标识符是否已经存在于系统中。如果已经存在,则认为是一个重复请求,服务器会忽略该请求或者返回相应的结果;如果不存在,则继续处理请求,并将该标识符保存到系统中,以便后续的校验。

2请求参数

某些请求参数可以用于校验请求的幂等性。例如,可以使用时间戳作为一个请求参数,在处理请求时,服务器验证时间戳与系统当前时间的差距是否在一个合理的范围内。如果差距过大,可以认为是一个重复请求,服务器会忽略或返回相应结果。

3状态检查

在处理请求之前,服务器可以先检查系统中的某个特定状态是否存在或满足特定条件。如果已经存在或满足条件,则认为是一个重复请求,服务器会忽略或返回相应结果。