意外路径变量类型上的 400 与 404

400 vs 404 on unexpected path variable type

假设我们有以下 API:

GET /api/colors/{color}
GET /api/integers/{number}

在代码中,我希望 'color' 将匹配枚举中的某个值,并且 'number' 是一个整数。

例如:

GET /api/colors/red
GET /api/integers/2

将以 HTTP 200 响应。

但是我应该如何回应这样的请求:

GET /api/colors/foo
GET /api/integers/bar

应该是404,因为颜色'foo'和整数'bar'不存在?或者 400 因为客户端没有使用一些约定的允许值(枚举、整数)?

Should it be 404 because color 'foo' and integer 'bar' does not exist?

404.

所有 4xx 状态代码都通知客户端请求存在某种问题。语义区别是 404 提示目标 uri 中存在拼写错误。

我们关心的原因之一:404cacheable;通用组件可以记住对请求的响应,并在重复请求时保存到服务器的往返。

响应 404 的资源稍后可能会 200

例如,您查询的颜色截至今天还没有,但明天可能会添加:

GET /api/colors/lightblue

应回复 404

而像/api/integers/bar这样的请求是格式错误的,将来也会格式错误,所以它应该以400响应;一个整数在语义上永远不能是一个字符串。

发送400告诉客户端"do not query this again",客户端可以"remember"(缓存)隐式地回答这个答案。

404 告诉客户 "right now, I don't have what you request, try again later"。客户端可以基于启发式或显式应用缓存。