API 设计中的业务错误应该使用哪个 HTTP 状态代码?

Which HTTP status code should be used for business errors in API design?

假设我有一个 API 端点执行一些业务操作,这可能会导致许多不同的故障,这些故障未直接连接到请求。

请求格式正确,我不能 return 4xx 失败,但应用程序的逻辑决定我 return 不同的错误消息。

现在我希望客户端能够区分这些错误消息,以便根据代码采取不同的操作。我可以 return 像这样的自定义 JSON 例如

{
  "code": 15,
  "message": "Some business error has occurred"
}

现在的问题是,如果 ConflictNotFound 这样的标准代码没有意义,我应该在这种情况下使用哪个 HTTP 状态代码。

似乎 500 InternalServerError 是合乎逻辑的,但是如果只是记录给定的状态代码是不可能重试的,那么我怎么能另外标记这不能重试,所以如果你可以重试没有得到其中之一?

咨询RFC 7231

503 服务不可用 看起来 像一个潜在的候选人,但 RFC 提到这应该代表一个问题“这可能会延迟一段时间后得到缓解。”这将向客户表明它可以稍后再尝试相同的呼叫,可能是在下班后或周末。这不是你想要的。

501 Not Implemented 是可能的,但 RFC 提到“这 是服务器无法识别时的适当响应 请求方法,并且无法为任何资源支持它。默认情况下,501 响应是可缓存的;”这里似乎不是这种情况 - HTTP 方法本身可能是有效的 - 这里的失败似乎发生在 业务规则 层(例如,发送一个不在数据库中的帐号),而不是您从未实现过的 HTTP 方法(GET、POST 等)。

剩下最后一个认真的候选人,

500 内部服务器错误

The 500 (Internal Server Error) status code indicates that the server encountered an unexpected condition that prevented it from fulfilling the request.

这是通常用于一般“应用程序发生异常”情况的错误代码。 500是最好的选择。

至于如何区分这与“临时内部故障”错误,您可以将其作为 的一部分 - 只要确保您的客户端可以解析自定义代码即可!