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

时间:2019-01-12 05:27:32

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

我认为这个问题并非微不足道,所以我想详细地表达一下

域:

我有一个端点(api rest),该端点接收我要阻止的约会的日期和时间(稍后将保留)。操作很简单,当接收到日期和时间时,该操作将被阻止,以使另一位客户无法在同一天和同一时间预订约会,而阻止约会的客户端则完成了联系信息。

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

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

评论:

最近在工作中,我遇到了这个难题,并且我与同事对此进行了激烈辩论。从那时起,我开始努力研究,并与在该主题方面具有多年经验的几位专家进行磋商,以便得出结论。

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

在这种情况下应该使用什么合适的选项?

谢谢!

1 个答案:

答案 0 :(得分:-1)

让我们看一下Wikipedia和MDN必须提供的内容:

  

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

     

4xx(客户端错误):请求语法错误或无法实现

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

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

当请求包含错误的语法(由于格式正确的请求在此情况下不是这种情况)或无法满足请求(在此情况下您想要的情况)时,一种情况可以视为4xx与客户沟通)。 对于此类针对业务用例的错误(例如针对您的案例的约会计划程序),建议继续执行422。

根据MDN:

  

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

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

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