我的余额存储在服务器的数据库中。我想要两个 API
addToBalance(amountToAdd)
subtractFromBalance(amountToSubtract)
我的问题如下:如果用户使用手机拨打其中一个电话,然后失去连接,我们无法判断余额是否已更新。所以我们不知道是否要重试。
我提出的一个解决方案是提供客户端知道的当前余额来验证是否已经有更新,如果提供的余额与实际当前余额不匹配,则更新应该失败。此解决方案的问题是,如果从其他地方更新余额,则调用将失败。我们不知道是否要区分两次失败,因此仍然不知道是否要重试。
有没有人有可能的解决方案来确保同一个调用不会被多次调用以避免多次加法和减法?
这是一个常见问题,HTTP 本身已经为您提供了解决方案,那就是使请求有条件。
当用户使用
GET
检索该资源时,您应该返回 Last-Modified
标头以及上次更改资源的时间戳。然后,您要求用户在更改时发送带有该值的 If-Unmodified-Since
标头。
如果其他人在中间更改了它,则资源时间戳将大于
If-Unmodified-Since
中发送的值,并且您应该使请求失败并显示 412 Precondition Failed
。如果用户未能包含 If-Unmodified-Since
标头,则您应该失败并显示 428 Precondition Required