"bad" 输入的良好请求使用什么 HTTP 状态?

What HTTP status to use for good request with "bad" input?

我正在编写一个用于验证促销代码的微服务。客户向我发送了促销代码和产品 ID (json)。有代码好的 200 OK 案例,我为他们的订单申请了折扣。但是有一个错误的案例,促销代码不适用于该产品。我不确定要使用什么响应代码。

这也应该是 200 OK(带有某种消息说代码验证失败)吗?

应该是400 Bad Request吧?

似乎都不完全合适,当它不是 "OK" 时说 200 OK 很奇怪,但是 4xx 通常表示请求/http 协议的结构有问题 - 在这种情况下请求的结构很好。

我会建议409:

10.4.10 409 Conflict

The request could not be completed due to a conflict with the current state of the resource. This code is only allowed in situations where it is expected that the user might be able to resolve the conflict and resubmit the request.

我会第二个steveax。 422似乎是个不错的选择。

恕我直言,如果请求失败,你不应该使用 200。

使用错误代码并在必要时在响应正文中提供详细信息:

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json

{ "reason": 1, "text": "Invalid promo code." }

转念一想,我认为 403 很适合这里:

HTTP/1.1 403 Forbidden
Content-Type: application/json

{ "reason": "bad_promo_code" }

最终,it doesn't matter只要它被记录下来。