意外路径变量类型上的 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 中存在拼写错误。
我们关心的原因之一:404
是 cacheable;通用组件可以记住对请求的响应,并在重复请求时保存到服务器的往返。
响应 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"。客户端可以基于启发式或显式应用缓存。
假设我们有以下 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 中存在拼写错误。
我们关心的原因之一:404
是 cacheable;通用组件可以记住对请求的响应,并在重复请求时保存到服务器的往返。
响应 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"。客户端可以基于启发式或显式应用缓存。