API开发:何时返回BAD REQUEST HTTP状态代码(REST)

时间:2011-09-03 00:01:25

标签: rest jersey jax-rs http-error

我们正在编写REST服务,并且当有人请求具有不存在的父ID的资源时,该怎么办?

示例:您要求提供与公司关联的人员列表,因此您{1}}的ID为1,但该公司ID不存在。

我认为REST的定义说我们会简单地返回一个空列表(导致GET),因为根据规范,HTTP错误请求只是格式错误的语法:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

由于语法格式错误,服务器无法理解该请求。客户端不应该在没有修改的情况下重复请求。

我认为更清楚的是没有要解释的错误,您请求的资源不存在。

关于最佳实践的想法?

这里有一个SO讨论:HTTP 400 (bad request) for logical error, not malformed request syntax虽然它有点抽象,但如果我发布这个,或者只是使用那个问题,我就会被撕裂。

3 个答案:

答案 0 :(得分:6)

如果你这样做

GET /company/1

并且不存在id为1的公司,那么我认为相应的HTTP状态代码是404 - 找不到。

但是,如果你这样做,

GET /companies?id=1

然后我会返回200和一个空的公司列表。

答案 1 :(得分:3)

204不是错误代码,它是成功代码,但这是一个狡辩。我不经常看到空列表,而是成功响应,只是没有有意义的内容来响应,例如成功的DELETE。例如,如果您要返回JSON,那么内容为[]的200就是我期望的空结果列表。但是,我不认为在你的情况下使用它是不正确的。

对于您描述的案例,

404 Not Found是一个更常见的错误。你是正确的,它不是语法错误,所以400不合适,但事实上,资源不存在。 404 Not Found是一个准确的回复。

但是在选择200,204和404之间时,正确的答案是:它取决于。问题是它是否是错误。 404更具表现力(客户可以说没有这样的公司)但你可以交换表达性以保证安全性,这意味着客户无法判断具有该id的公司是否存在可能是件好事。 / p>

答案 2 :(得分:0)

缓存怎么样?只有200会被缓存,204和404都不会被缓存。如果这是重要的200空列表似乎没问题。不确定空单元素呢?