我正在构建一个基于REST的幂等POST API调用。我想实现幂等性行为,以避免客户端在网络故障期间创建重复资源。超时。客户端在每个API调用的请求标头中传递ClientToken。我的POST请求有标准的有效负载,我有围绕它的验证逻辑。在重试期间,API期望的理想幂等行为是什么?它应该仅依赖于ClientToken还是忽略请求有效负载,还是应该在使用ClientToken调用幂等检查之前在请求有效负载上运行验证逻辑?
答案 0 :(得分:0)
首先,作为HTTP方法,POST不是幂等的。幂等意味着多个相同的请求应该具有与单个请求相同的效果。
如果更改有效负载,则不再具有相同的请求。如果您使用相同的令牌,那么服务器上会发生什么?第二个不同的请求是否会引起副作用?如果它确实那么它就不再是无能为力的了。另一方面,如果结果相同,则该方法是无效的,因此有效负载无关紧要,但您不再需要相同的请求来尊重HTTP的幂等性。
我个人会检查请求是否具有相同的有效负载,并拒绝具有不同有效负载的后续请求。
答案 1 :(得分:0)
这取决于,但对于我已实施的幂等API,我总是首先检查令牌。
因为我只将幂等性标记存储在与对数据库所做的更改相同的事务中(例如插入新资源),我知道如果它是他们的,那么请求的内容已经提交并且之前已经工作过了。 / p>
如果令牌存在,我会在验证有效负载之前立即将带有链接(用于POST)创建的201返回给客户端。
这样做的原因是客户端的游戏规则是幂等标记允许您完全重试相同的请求。如果有人写了一个足够愚蠢的客户端来改变有效负载并使用相同的幂等性令牌,那就是他们的头脑。
首先检查幂等性令牌的好处是,如果有效载荷的验证很重要,它可以节省一些验证工作。