8

即使在阅读了许多文档、书籍、规范之后, 我也不能 100% 确定在我的情况下我应该使用 http 状态代码 403 还是 409。

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

而且,从规范来看,当我们可以预期客户端可以解决问题时,似乎使用了 409。

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

编辑后:这个例子很长,但简单地说,它是关于当约束验证失败时返回什么代码。当约束验证失败时,你总是返回 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?)

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

4

1 回答 1

1

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

HTTP 409不是很常见。它描述了导致错误的冲突(如死锁或其他类型的问题)。我认为Mozilla在描述这个最常与PUT动词一起出现的错误时给出了很好的建议。

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

于 2017-07-12T17:23:17.993 回答