我们正在编写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虽然它有点抽象,但如果我发布这个,或者只是使用那个问题,我就会被撕裂。
答案 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空列表似乎没问题。不确定空单元素呢?