我认为这个问题并非微不足道,所以我想详细地表达一下
域:
我有一个端点(api rest),该端点接收我要阻止的约会的日期和时间(稍后将保留)。操作很简单,当接收到日期和时间时,该操作将被阻止,以使另一位客户无法在同一天和同一时间预订约会,而阻止约会的客户端则完成了联系信息。 >
到目前为止,非常简单。当两个不同的用户在其浏览器中选择相同的日期和时间并且同时触发两个请求时,问题就开始了。我们已经知道,您不能在同一天和同一时间两次阻止约会,因此应用程序将失败(尽管此失败已得到适当控制)。
简而言之,两个用户尝试在相同的日期和时间阻止约会,只有首先处理的请求才会成功。 对于设法阻止约会的用户,答案很明确:200 OK状态。 问题是,哪个状态代码http对应于返回第二个用户?
评论:
最近在工作中,我遇到了这个难题,并且我与同事对此进行了激烈辩论。从那时起,我开始努力研究,并与在该主题方面具有多年经验的几位专家进行磋商,以便得出结论。
在这种情况下应该使用什么合适的选项?
谢谢!
答案 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请求链接,客户端以后可以从中获取请求的资源。