【问题标题】:Rest service returns 404休息服务返回 404
【发布时间】:2015-06-18 11:31:32
【问题描述】:

如果对休息服务的调用执行数据库查询,但未找到结果并返回,则返回代码的最佳做法是什么。

这应该是 404 还是 200,并显示没有记录的消息?

URL 已正确解析,没有发生服务器错误,只是没有返回任何记录。

编辑: 示例网址为:

http://localhost/app/pr_xyz/1234

用于检索属于现有用户 1234 的 xyz 列表。用户 id 1234 已被检索并且已知存在于数据库中。此 URL (pr_xyz) 只是为了检索属于该用户的 xyz 列表。

关系是 1 个用户与 0 个或多个 xyz。

在这种情况下,现有用户没有 xyz。这应该是带有有意义消息的 404 还是 200。

我也无法控制 URL。

【问题讨论】:

  • 200 在我看来,有一个有意义的信息
  • 不。不是200。如果找不到资源,应该是404。见Is it correct to return 404 when a REST resource is not found?
  • @peeskillet 在这种情况下可以找到资源并正确执行。其余服务正确解析只是查询的结果是没有记录。您发布的链接讨论了检索服务以及找不到服务时该怎么办,当然应该是 404。
  • 您将什么定义为“资源”?你的意思是 JAX-RS “方法” 吗?方法本身不是资源。资源是应该从特定 URI 返回的内容。假设 URI 是 ../users/123。资源是用户,由该 URI 标识。如果找不到用户,它应该是 404。这是一般用例,123 可能是 URI 模板的一部分。 JAX-RS 方法处理对@Path("users/{id}") 的所有请求。此方法处理尝试查找不同资源的尝试,具体取决于 id。如果找不到 == 404
  • 该链接与查找服务无关。我认为您的主要困惑是您将 "method" 或 JAX-RS 休息服务端点视为“资源”,但事实并非如此。

标签: rest http jakarta-ee


【解决方案1】:

同意@Satya,它应该是 200,但我们可以通过向后工作来得出答案。

所以,我们从full list of HTTP status codes. 开始。从底部开始。

  • 是服务器错误吗?不?那就不是5xx了
  • 是客户端错误吗?可能是?也许不是 4xx
  • 显然不是重定向,所以不是 3xx。
  • 呼叫是否成功?也许吧。
  • 您是否返回临时响应?不,它也不是 1xx。

所以通过消除过程,它正在查看 2xx 代码。究竟哪个更合适取决于您的应用程序的语义。

既然这不是 DELETE 调用,那么我可能不会使用 204 No Content,这可能是唯一不错的选择。并不是没有内容。

有内容:“找到 0 个结果”。没有搜索结果时,Google 不会向您显示空白页。

所以我们到达了 200,并返回了一个有意义的身体。如果您要返回原始结果,那么您可能需要考虑将它们包装在搜索结果对象中以提供一些元数据。

啊!等等,如果您指示的是 RESTful 资源集合而不是搜索结果,该怎么办?

GET /items

在这种情况下,我仍然会返回一个 200 并带有一个显示没有项目的正文。

如果您试图检索特定资源怎么办?

GET /items/1234

在这种情况下,是的,你想暗示项目 1234 不存在,你应该返回 404。

【讨论】:

  • 那么你是说如果一个方法(端点)有一个"/users/{id}"的URI模板,并且请求的URI是"/users/123",并且从那个{id}查询数据库并且没有找到,你还会返回 200 吗?
  • 不,我的回答的最后一段明确表示在这种情况下返回 404。最初的问题暗示许多结果(即不是单一资源)是可能的,因此 200 成为替代方案。
  • 除非 OP 专门询问访问返回空结果集的集合资源,否则我会说这并不能解决主要问题。我可能误解了这个问题,但我不是这样读的。
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 2019-03-26
相关资源
最近更新 更多