【问题标题】:Should idempotent POST API call check API request payload before using client token to check idempotency?在使用客户端令牌检查幂等性之前,是否应该幂等 POST API 调用检查 API 请求负载?
【发布时间】:2015-02-27 06:39:20
【问题描述】:

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

【问题讨论】:

    标签: api rest idempotent


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 知道了。如果客户端弄乱了请求,我们是否应该返回不同的错误——相同的 ClientToken 但不同的有效负载?服务器无法将其作为新请求处理,因为它看到相同的 ClientToken 并且它无法返回先前的成功响应,因为请求有效负载不相同。
      • @user3236022:是的,对于具有相同客户端令牌但不同负载的额外请求,您可以返回 4xx 范围内的状态代码
      • HTTP 标准只说 POST 就代理等所有中间体而言被视为不安全...使用令牌实现幂等 POST 是完全可能的,而且确实是一种很好的做法.但是,您的客户端需要遵守规则,并且只使用相同的有效负载重试失败的请求。如果他们不这样做,那么结果就在他们头上。
      • 您应该返回与第一个请求相同的代码,因为客户端正在重试并且显然没有收到第一个响应。幂等性的优点之一是它允许简化客户端重试/失败逻辑。如果你要在他们重试时给他们一个 4xx 的耳光,因为他们显然没有得到第一个响应,现在他们必须去获取资源来弄清楚发生了什么!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 2020-11-10
      • 2018-05-31
      • 2012-12-09
      • 1970-01-01
      • 2016-03-18
      • 2021-11-08
      相关资源
      最近更新 更多