【问题标题】:Dilemma between 2xx and 4xx status codes in api restapi rest中2xx和4xx状态码之间的困境
【发布时间】:2019-01-12 13:57:14
【问题描述】:

我觉得这个问题不小,所以想详细表达一下

域:

我有一个端点(api rest)接收我想要阻止的约会的日期和时间(稍后将被保留)。操作简单,收到日期和时间后,将其屏蔽,使其他客户无法在同一天和时间预约,而屏蔽预约的客户,填写联系信息。 p>

到目前为止,非常简单。当两个不同的用户在他们的浏览器中选择相同的日期和时间并且同时触发两个请求时,问题就开始了。正如我们已经知道的那样,您不能在同一日期和同一时间两次阻止约会,因此应用程序将失败(尽管此失败得到了适当的控制)。

简而言之,两个用户尝试在同一日期和时间阻止约会,只有最先处理的请求才会成功。 对于成功阻止约会的用户,答案很明确:200 OK 状态。 问题是,http对应返回给第二个用户的状态码是什么?

评论:

最近在工作中,我遇到了这个困境,为此我与一位同事进行了激烈的争论。从那以后,我开始努力研究,并咨询了几个在这个领域有多年经验的人,以便能够得出一个结论。

  • 2xx:一半的人回答说州代码应该是 2xx。为什么?首先,因为请求是精心制定的(主要是参数,写得正确)所以它不会对应客户端错误(4xx),另一方面,它不是服务器的意外错误(500),因为它由业务逻辑本身适当控制。由于查询已正确完成,它应该发送一个 2xx 状态(更准确地说是 200)指示请求成功,并在正文上显示一条消息,指示操作的“状态”(无法阻止约会)。
  • 4xx:我的立场(以及其他 50% 的咨询者的立场)是,可以看出,请求失败是因为无法完成所需的操作。返回 200 OK(表示一切顺利)和一条描述发生的错误或情况的消息(在某​​种程度上,这与我相矛盾)似乎完全不合逻辑。发生错误时,只有两种可能有罪:客户端和服务器。在这种情况下,在我看来服务器不是,因为它不会意外失败,但该业务规则是经过深思熟虑的,并且故意失败(因此它不会是 5xx)。当尝试对同一资源执行两次相同的操作时,一切似乎都符合客户端错误,也许是语义错误。因此,我认为错误 400 会根据情况进行调整,如果我们想更具体一点,可能会出现 409,表明我们试图同时修改不允许此操作的资源。

对于这种情况应该有什么合适的选择?

谢谢!

【问题讨论】:

    标签: rest http http-status-code-400 http-status-code-200 http-status-code-409


    【解决方案1】:

    让我们看看 Wikipedia 和 MDN 对此提供了什么:

    2xx(成功):请求被成功接收、理解并接受

    4xx(客户端错误):请求包含错误语法或无法完成

    (来源:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

    在约会冲突的情况下,接收并理解第二个用户的请求,但不能接受,因此在这种情况下返回 2xx 似乎是错误的。

    当请求包含错误的语法(此处不是这种情况,因为请求格式正确)或无法满足请求(这似乎是您想要的情况)时,情况符合 4xx与客户沟通)。 对于特定于业务用例(例如您的案例的约会安排程序)的此类错误,建议可以继续使用 422

    根据 MDN:

    超文本传输​​协议(HTTP)422 Unprocessable Entity响应状态码表示服务器理解请求实体的内容类型,请求实体的语法是正确的,但是无法处理包含的指令。

    (来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422

    此外,由于预约会在后端创建一个资源(即包含访客、时间等详细信息的有效预约 ID),我更愿意发回 201(已创建)状态码以表示成功以同步方式执行任务的情况。在我看来,200(OK)状态码更适合资源将被异步创建并且在服务器响应回客户端时可能不会立即可用的情况。在这种情况下,我们通常会提供一个 GET 请求链接,客户端将来可以从中获取请求的资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多