在使用客户端令牌检查幂等性之前,幂等POST API调用是否应该检查API请求负载?

在使用客户端令牌检查幂等性之前,幂等POST API调用是否应该检查API请求负载?,api,rest,idempotent,Api,Rest,Idempotent,我正在构建一个基于幂等REST的POST API调用。我想实现幂等行为,以避免客户端在网络故障和超时期间创建重复资源。客户端在每个API调用的请求头中传递ClientToken。我的POST请求有标准的有效负载,我有验证逻辑。在重试期间,API的理想幂等行为是什么?它应该仅仅依赖于ClientToken并忽略请求负载,还是应该在使用ClientToken调用幂等检验之前对请求负载运行验证逻辑?首先,POST作为HTTP方法不是幂等的。幂等意味着多个相同的请求应该与单个请求具有相同的效果 如果更改

我正在构建一个基于幂等REST的POST API调用。我想实现幂等行为,以避免客户端在网络故障和超时期间创建重复资源。客户端在每个API调用的请求头中传递ClientToken。我的POST请求有标准的有效负载,我有验证逻辑。在重试期间,API的理想幂等行为是什么?它应该仅仅依赖于ClientToken并忽略请求负载,还是应该在使用ClientToken调用幂等检验之前对请求负载运行验证逻辑?

首先,POST作为HTTP方法不是幂等的。幂等意味着多个相同的请求应该与单个请求具有相同的效果

如果更改有效负载,则不再有相同的请求。如果使用相同的令牌,那么服务器上会发生什么?第二个不同的请求是否会导致副作用?如果它这样做了,那么它就不再是无能的。另一方面,如果结果是相同的,那么该方法是独立的,因此有效负载并不重要,但是您不再需要相同的请求来尊重HTTP的幂等性


我个人会检查请求是否具有相同的负载,并拒绝具有不同负载的后续请求。

这取决于情况,但对于我实现的幂等API,我总是首先检查令牌

因为我只将幂等标记存储在与对数据库所做更改(例如插入新资源)相同的事务中,所以我知道,如果它是它们的,那么所请求的任何内容之前都已经提交并工作过了

如果令牌存在,我将在验证有效负载之前立即向客户端返回创建的201,其中包含链接(用于POST)

原因是客户端的游戏规则是幂等令牌允许您重试完全相同的请求。如果有人编写了一个客户端,它愚蠢到可以更改有效负载并使用相同的幂等标记,那就是在他们的头上


首先检查幂等标记的好处是,如果有效负载的验证非常繁重,它可能会节省一些验证工作。

明白了。在客户端弄乱了请求的情况下,我们是否应该返回不同的错误-相同的ClientToken但不同的负载?服务器无法将其作为新请求处理,因为它看到相同的ClientToken,并且无法返回以前的成功响应,因为请求负载不相同。@user3236022:是,对于具有相同客户端令牌但不同支付量的额外请求,您可以返回4xx范围内的状态代码。HTTP标准仅说明POST在所有中间产品(如代理等)方面都不安全。。。使用标记实现幂等POST是完全可能的,而且是很好的实践。但是,您的客户机需要遵守规则,只需使用相同的负载重试失败的请求。如果他们没有,那么结果就在他们头上。您应该返回与第一个请求相同的代码,因为客户端正在重试,并且显然没有收到第一个响应。幂等性的优点之一是它允许简化客户端重试/失败逻辑。如果你打算在他们重试时用4xx打他们,因为他们显然没有得到第一个响应,那么现在他们必须去获取资源来弄清楚发生了什么!