我有一个带有返回对象的调用,但此调用可能会返回空结果。
我在控制器中的 URL 是:
/api/find-by-id/{id}
此控制器按如下方式调用服务:
service.findById(Integer id);
我的服务通过DAO搜索:
repository.findById(Integer id);
当 DAO 返回空值时,我应该将错误HTTP 404
或HTTP 204
发送到前面吗?
考虑到:
2xx:成功 - 已成功接收操作, 理解和接受
4xx:客户端错误 - 请求包含错误的语法或无法 得到满足
HTTP 204
:表示已找到某些内容,但它是空的。
HTTP 404
: 未找到。
如果您的findById
总是只返回 0 或 1 个项目,并且这是您的请求:
GET /api/find-by-id/{id}
那么我相信如果一个项目不存在,结果应该是 404。
204
是不同的。它实际上并不意味着某个项目不存在,它意味着操作成功,但结果为空 + 超媒体客户端不应刷新当前视图。它很少用作对GET
请求的响应,因为它没有多大意义。
由于听起来像您正在使用数据库,因此相当于204
/空将是具有该 id 的数据库记录,但所有字段都null
.等效于404
数据库记录根本不存在。
空结果 204 或 404 的请求中的 HTTP 返回代码是什么?
一个可能有用的类比 - 想象一下在文件系统上查找文件。
- 如果我找到该文件,并且它是零字节长 -> 204。
- 如果我根本找不到该文件 -> 404。
204具体描述了响应的内容正文;该主体的长度为零字节。 因此,204
是不合适的,例如,如果您要发送空对象的应用程序/json表示形式。
{}
相反,您将使用其他 2xx 响应代码之一(可能是 200(。
404 是"我找不到它 - 你拼写错了 URL 吗?
404(未找到(状态代码表示源服务器未找到目标资源的当前表示形式,或者不愿意透露该表示形式存在。
Evans将存储库模式描述为调用代码提供一种错觉,即所有对象都保存在内存集合中。 因此,如果"空值"表示"id 与集合中的项目不匹配",则404
是一个不错的选择。
如果 id 确实检索了一个项目,但响应正文的长度为零字节(因为该项目为空或其他什么(,那么204
是一个不错的选择。
如果您正在调用 api 并且结果为空,则代码仍然是 202 或 204(如果需要编目器(,
当您执行请求并且不存在时,它是 404 ,最常见于死链接、断开链接或错误链接。
控制器或服务需要在 204 时执行操作,例如重定向到 404 页面。