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

Clo*_*ist 6 rest http-status-codes http-status-code-403 http-status-code-400 http-status-code-409

即使阅读了许多文档,书籍和规范, 我也无法100%确定我应该使用http状态代码403还是409。

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

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

我会欣赏现实世界中的各种示例,其中包括何时使用403和何时使用409,以及在我的情况下使用哪种代码的见解,我将在下面的摘要中进行介绍(以免违反NDA) )。

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


有一个客户告诉服务A哪个书架包含一本特定的书。在向DB记录哪个书放在哪个书架上时,服务A可以告诉客户该客户正试图将书放在错误的书架上。服务A可以通过询问另一个服务B来告知这一点,该服务B在决定书的去向时基本上具有某种逻辑。

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

(该请求与服务B的决定相冲突-409?-但客户端无法解决此问题,因为当服务B做出决定时,该请求是永久性的。书号和书架号都在path参数中(即,它们是此端点中的唯一参数),因此客户端无法真正做出任何更改来解决同一请求的问题)

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

预先感谢您的时间和投入!

Dan*_*rza 1

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

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

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

  • 嗯,至少就我而言,我不会说这是服务器端错误,因为我认为是客户端发出了错误的请求。我想知道 ppl 是否使用 403 来解决未授权(缺少范围)问题。或者一些现实世界中 403 或 409 的例子。但是感谢您的努力! (8认同)