出现并发错误时抛出什么状态码?
what status code to throw when there is a concurrency error?
我有休息时间,除其他事项外,还有一个日期,并用它进行预订。当 2 个人 "at the same time" 尝试在同一天同时预订时会出现问题。
显然,第一个提出请求的人将能够预约,所以我将 return 状态设置为 200。另一方面,较晚到达的人将预约相同的请求,但服务器将抛出错误,因为它无法保留相同的约会(已保留)。在这种情况下,应该抛出什么 http 状态代码?
家族代码 500 似乎不对,因为抛出的异常是由业务逻辑引起的。
另一方面,400 家庭的州代码似乎也不正确,因为请求制定得很好
谢谢!
我自己正在研究这个,jonrsharpe 的 409 冲突建议是最合适的。
https://www.rfc-editor.org/rfc/rfc7231#section-6.5.8:
409(冲突)状态码表示请求无法
由于与目标的当前状态冲突而完成
资源。此代码用于用户可能
能够解决冲突并重新提交请求。服务器
应该生成一个有效负载,其中包含足够的用户信息
认清冲突的根源。
冲突最有可能在响应 PUT 请求时发生。为了
例如,如果正在使用版本控制并且表示正在
PUT 包含对资源的更改,这些更改与由
较早的(第三方)请求,源服务器可能使用 409
响应表明它无法完成请求。在这个
情况下,响应表示可能包含信息
用于根据修订历史合并差异。
适当的错误代码取决于实现和检测到并发错误的位置。
如果您使用 Http If-Match header Http 规范要求 412 前提条件失败(由于 header 信息而出错),而如果实体会导致冲突则使用 409 .
在竞争条件下,两个请求可以通过 If-Match 检查,只有数据库或域层检测到冲突。在那种情况下,我会 return 一个 409,因为前提条件是有效的。
如果您不使用 If-Match 和 ETag,但在 body 中使用版本 ID,那么您需要使用 409。请注意 DELETE
不应该有body.
我有休息时间,除其他事项外,还有一个日期,并用它进行预订。当 2 个人 "at the same time" 尝试在同一天同时预订时会出现问题。
显然,第一个提出请求的人将能够预约,所以我将 return 状态设置为 200。另一方面,较晚到达的人将预约相同的请求,但服务器将抛出错误,因为它无法保留相同的约会(已保留)。在这种情况下,应该抛出什么 http 状态代码?
家族代码 500 似乎不对,因为抛出的异常是由业务逻辑引起的。
另一方面,400 家庭的州代码似乎也不正确,因为请求制定得很好
谢谢!
我自己正在研究这个,jonrsharpe 的 409 冲突建议是最合适的。
https://www.rfc-editor.org/rfc/rfc7231#section-6.5.8:
409(冲突)状态码表示请求无法 由于与目标的当前状态冲突而完成 资源。此代码用于用户可能 能够解决冲突并重新提交请求。服务器 应该生成一个有效负载,其中包含足够的用户信息 认清冲突的根源。
冲突最有可能在响应 PUT 请求时发生。为了 例如,如果正在使用版本控制并且表示正在 PUT 包含对资源的更改,这些更改与由 较早的(第三方)请求,源服务器可能使用 409 响应表明它无法完成请求。在这个 情况下,响应表示可能包含信息 用于根据修订历史合并差异。
适当的错误代码取决于实现和检测到并发错误的位置。
如果您使用 Http If-Match header Http 规范要求 412 前提条件失败(由于 header 信息而出错),而如果实体会导致冲突则使用 409 .
在竞争条件下,两个请求可以通过 If-Match 检查,只有数据库或域层检测到冲突。在那种情况下,我会 return 一个 409,因为前提条件是有效的。
如果您不使用 If-Match 和 ETag,但在 body 中使用版本 ID,那么您需要使用 409。请注意 DELETE
不应该有body.