空结果请求204或404中的什么HTTP返回代码?

时间:2018-10-05 13:56:30

标签: rest http

我有一个带有返回对象的调用,但是此调用可能返回空结果。

我在控制器中的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:未找到。

3 个答案:

答案 0 :(得分:2)

如果您的findById始终返回恰好0或1项,这是您的要求:

GET /api/find-by-id/{id}

然后,我认为如果某一项不存在,结果应该为404。

204是不同的。这并不是说项目确实不存在,而是表示操作成功,但是结果为空+超媒体客户端不应刷新当前视图。它很少用作对GET请求的响应,因为它没有太大意义。

由于听起来您正在使用数据库,所以等效于204 /空的将是具有该ID的数据库记录,但是所有字段均为null。与404等效的是数据库记录根本不存在。

答案 1 :(得分:1)

  

空结果204或404请求中的HTTP返回代码是什么?

一个可能有用的类比-想象在文件系统上查找文件。

  • 如果找到文件,并且它的长度为零字节-> 204。
  • 如果根本找不到该文件-> 404。

204具体描述了响应的内容主体;正文为零字节长。因此,204是不合适的,例如,如果您要发送空对象的应用程序/ json表示形式。

{}

相反,您将使用其他2xx响应代码之一(可能为200)。

404是“我找不到-您的URL拼写错误吗?”

  

404(未找到)状态代码表示原始服务器未找到目标资源的当前表示,或不愿意透露该资源的存在。

Evans将存储库模式描述为向调用代码提供一种幻觉,即所有对象都保存在内存集合中。因此,如果“空值”表示“ id与集合中的项目不匹配”,那么404是一个不错的选择。

如果id确实检索到一个项目,但是响应的主体为零字节长(因为该项目为空,或其他),那么204是一个不错的选择。

答案 2 :(得分:0)

如果您正在调用api并且结果为空,则如果要使用编目程序,代码仍为202或204,

当您执行请求且该请求不存在时,它是404,最常见于无效,断开或错误的链接。

您的控制器或服务需要在204时执行操作,例如重定向到404页面。