当具有指定属性且应唯一的记录已经存在时,是否可以使用 409 HTTP 代码?

Val*_*nko 4 rest http

我有一个包含两个唯一列的表。对于尝试创建具有重复列值的记录的 PUT 请求,返回 409 是否可以?

Voi*_*son 7

当具有指定属性且应唯一的记录已经存在时,是否可以使用 409 HTTP 代码?

当然。

将状态代码视为元数据可能会有所帮助;它们是为了让通用组件粗略地了解 HTTP 响应的性质而提供的信息,而不是为 API 使用者提供的信息。

如果您愿意,请考虑网络上的常见情况:我们发送 404 响应,以便浏览器(以及沿途的任何通用缓存)了解响应正文是客户端错误描述的表示,以便他们可以正确操作本地缓存。

但人类会得到失败鲸的 HTML 表示形式。

鉴于状态代码的主要受众是机器而不是人,您可以通过研究不同代码的后果来了解状态代码的适当性。

事实是,对于许多代码... 400 vs 403 vs 409 vs 等等... 机器可以做的事情并没有太多,一个代码与下一个代码不同。在很多情况下,您所希望的最好结果就是突出显示问题根源所在的 http 请求部分(方法令牌、URI、HTTP 版本、正文、授权...)。

409 对于您的情况来说是一个不错的选择 - 特别是,它引起对请求正文的注意,通知当前请求的语义与资源的当前状态之间存在一些不兼容,并指示客户端可能能够解决冲突并重新提交请求。

但如果你选择“403”,负面影响就很小了。从表面上看,实际上,这并不重要。