我觉得这个问题不是小事,所以想详细表达一下
领域:
我有一个端点(api rest),它接收我想要阻止的约会的日期和时间(稍后将被保留)。操作简单,收到日期和时间后,将其封锁,使其他客户无法在同一天和同一时间预约,而封锁预约的客户,完成联系信息。
到目前为止,非常简单。当两个不同的用户在他们的浏览器中选择相同的日期和时间并且同时触发两个请求时,问题就开始了。正如我们已经知道的,您不能在同一日期和同一时间两次阻止约会,因此应用程序将失败(尽管此失败得到了适当的控制)。
简而言之,两个用户尝试在同一日期和时间阻止约会,只有最先处理的请求才会成功。对于成功阻止约会的用户,答案很明确:200 OK 状态。问题是,返回给第二个用户的http对应的是哪个状态码?
评论:
最近在工作中,我遇到了这个困境,为此我与一位同事进行了激烈的争论。从那以后,我开始努力研究,并咨询了几个在这个领域有多年经验的人,以便能够得出一个结论。
- 2xx:一半的人回答说州代码应该是 2xx。为什么?首先,因为请求是精心制定的(主要是参数,写得正确)所以它不会对应客户端错误(4xx),另一方面,它不是服务器的意外错误(500),因为它由业务逻辑本身适当控制。由于查询已正确完成,它应该发送一个 2xx 状态(更准确地说是 200)表示请求成功,并在正文上显示一条消息,指示操作的“状态”(无法阻止约会)。
- 4xx:我的立场(以及其他 50% 的咨询者的立场)是,可以看出,请求失败是因为无法完成所需的操作。返回 200 OK(表示一切顺利)和描述发生的错误或情况的消息(在某种程度上,这与我相矛盾)似乎完全不合逻辑。发生错误时,只有两种可能有罪:客户端和服务器。在这种情况下,在我看来服务器不是,因为它不会意外失败,但该业务规则是经过深思熟虑的,并且故意失败(因此它不会是 5xx)。当尝试对同一资源执行两次相同的操作时,一切似乎都符合客户端错误,也许是语义错误。因此,我的观点是错误 400 会根据情况进行调整,
对于这种情况,什么应该是合适的选择?
谢谢!