在实践中区分 HTTP 状态码 403 和 409(或 400)

Posted

技术标签:

【中文标题】在实践中区分 HTTP 状态码 403 和 409(或 400)【英文标题】:Distinguishing HTTP status code 403 and 409 in practice (or 400) 【发布时间】:2017-12-17 05:50:13 【问题描述】:

即使在阅读了许多文件、书籍之后,spec 我不能 100% 确定我应该使用 http 状态码 403 还是 409。

有些人认为 403 应该仅用于授权问题,但看到 twitter's api 使用 403 违反更新限制,我认为 403 的实际使用不仅仅是授权问题。也许它可以用来告诉请求违反了服务器端约束。

而且,根据规范,当我们可以预期客户端可以解决问题时,似乎会使用 409。

我会很欣赏一些现实世界中何时使用 403 和何时使用 409 的示例,以及在我的案例中使用哪种代码的意见,我将在下面的摘要中列出(以免违反保密协议)。

编辑后:这个例子很长,但简单地说,它是关于当约束验证失败时返回什么代码。当约束验证失败时,你总是返回 400 吗?我应该返回 400 而不是 403 或 409?


有一个客户端告诉服务 A 哪个书架包含特定的书。在向数据库记录哪本书在哪个书架上时,服务 A 能够告诉客户客户正试图将书放在错误的书架上。服务 A 可以通过询问另一个服务 B 来判断这一点,该服务 B 在决定一本书应该去哪里时基本上有一些逻辑。

在这种情况下,服务 A 应该使用什么 http 代码?

(请求与服务 B 的决定冲突 -- 409? -- 但是客户端无法解决这个问题,因为当服务 B 做出决定时,它是永久的。并且书 id 和书架 id 都在路径参数中(即,它们是此端点中的唯一参数),因此客户端无法真正进行任何更改以解决相同请求的问题)

此外,客户端能够告诉服务 A 不应再使用书架(因为它已满或出于任何原因)。当客户端告诉服务 A 书架 C 不再使用时,然后客户端告诉服务 A 它想在书架 C 上放另一本书,服务 A 应该告诉客户端它不能这样做。在这种情况下,服务 A 应该使用什么 http 代码? (该请求会与说书架 C 未使用的数据库状态冲突 - 409?但客户端无法解决此问题,因为当书架未使用时,它在服务 A 中是永久的,并且从不使用再次——不是 409?)

提前感谢您的时间和投入!

【问题讨论】:

【参考方案1】:

在提到的两个代码中,HTTP 403 更为常见,它描述了一个有效(但未经授权)的请求

HTTP 409 不是很常见。它描述了导致错误的冲突(如死锁或其他类型的问题)。我认为Mozilla gives good advice 在描述此错误时最常使用PUT 动词。

对于更广泛的错误情况,我建议使用 500 错误代码

【讨论】:

感谢您的输入,您的意思是 400 btw,当您说 500 时? 不——我的意思是500。错误代码500 表示一般应用程序或服务器错误。错误代码400 表示请求错误——相当于表示发送的参数之一不正确。 嗯,至少在我的情况下,我不会说这是服务器端错误,因为我认为是客户端发出了错误的请求。我想知道 ppl 是否使用 403 甚至没有授权(缺少范围)问题。或者一些真实世界的 403 或 409 示例。但感谢您的努力!

以上是关于在实践中区分 HTTP 状态码 403 和 409(或 400)的主要内容,如果未能解决你的问题,请参考以下文章

是否允许使用 409 Conflict 状态码来防止在 HTTP PUT 请求中更新某些字段

http协议的状态码——400,401,403,404,500,502,503,301,302等常见网页错误代码

http协议的状态码——400,401,403,404,500,502,503,301,302等常见网页错误代码

http响应状态码402和403的区别

HTTP响应码403 Forbidden和401 Unauthorized对比

HTTP 状态消息 200 302 304 403 404 500 分别表示啥?