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