即使阅读了很多文件,书籍,spec 在我的情况下,我不能100%确定是否应该使用http状态代码403或409。
有些人认为403应仅用于授权问题,但看到twitter's api使用403更新限制违规,我认为403实际使用范围比授权问题更广泛。也许它可以用来告诉请求违反了服务器端约束。
而且,根据规范,当我们可以预期客户端可以解决问题时,似乎会使用409。
我很欣赏一些关于何时使用403和何时使用409的真实世界的例子,以及关于在我的案例中使用哪些代码的意见,我将在下面的摘要中列出(以免违反NDA)。
编辑后:示例很冗长,但简单地说,它是关于约束验证失败时要返回的代码。当约束验证失败时,您总是返回400吗?我应该返回400而不是403或409吗?
有一个客户端告诉服务A哪个货架包含一本特定的书。在向DB记录哪个书在哪个书架上时,服务A能够告诉客户端客户端正试图将书放在错误的书架上。服务A可以通过询问另一个服务B来判断这一点,该服务B在决定书应该去哪里时基本上有一些逻辑。
在这种情况下,应该使用什么http代码?
(请求与服务B的决定 - 409相冲突? - 但客户端无法解决此问题,因为当服务B做出决定时它是永久性的。而book id和bookshelf id都在路径参数中(即,它们是此端点中的唯一参数)因此客户端无法进行任何更改以使用相同的请求解决问题)
此外,客户能够告诉服务A不应再使用书架(因为它已满或因任何原因)。当客户端告诉服务A书架C不再使用时,然后客户端告诉服务A它想要将另一本书放在书架C上,服务A应告诉客户它不能这样做。什么http代码应该服务A在这种情况下使用? (该请求将与书架C未使用的数据库状态发生冲突 - 409?但是客户端无法解决此问题,因为当书架未使用时,它在服务A中是永久性的,并且它永远不会被使用再次 - 不是409?)
提前感谢您的时间和意见!
答案 0 :(得分:2)
在提到的两个代码中,HTTP 403更为常见并描述了有效(但未经授权)的请求
HTTP 409并不常见。它描述了导致错误的冲突(如死锁或其他类型的问题)。我认为Mozilla gives good advice描述了PUT
动词最常出现的错误。
对于更广泛的错误情况,我建议使用500
错误代码