api rest中2xx和4xx状态代码之间的困境



我认为这个问题不是小事,所以我想详细地表达一下

域:

我有一个端点(api rest),它接收我想要阻止的约会的日期和时间(稍后将保留)。操作很简单,当收到日期和时间时,它会被阻止,这样另一个客户就不能在同一天和时间预约,而阻止预约的客户会完成联系信息

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

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

评论:

最近在工作中,我遇到了这种困境,我和一位同事就此事进行了激烈的争论。从那以后,我开始努力研究,并咨询了几位在这方面有多年经验的人,以得出结论。

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

对于这种情况,应该选择什么

谢谢!

让我们看看维基百科和MDN在以下方面提供了什么:

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

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

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

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

当请求包含错误的语法时(这里的情况并非如此,因为请求的格式很好),或者当请求无法满足时(这里似乎是您想要与客户端通信的情况),这种情况都符合4xx。一个建议可以是针对特定于业务用例的此类错误(例如您的用例的预约调度程序)进行422

根据MDN:

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

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

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

相关内容

  • 没有找到相关文章

最新更新