【问题标题】:RESTful API: What to do when there is nothing to returnRESTful API:没有什么可以返回时怎么办
【发布时间】:2018-01-15 19:24:57
【问题描述】:

根据我对 RESTful API 的理解:

  • 如果我要求的 ID 不存在(例如 /users/999/posts 用户 999 不存在),它应该返回 404 状态码。

    李> 1234563从来没有发布过任何东西)

我在这里看到的问题通常与这两种情况有关。

现在我的问题是当我没有数据时,我使用的是有效 ID,但我应该返回一个对象而不是列表。

例如,假设由于某种原因,当我请求/users/999 时,我不想总是返回用户的地址。我有这条不同的路线:/users/999/address,它返回一个地址对象。

如果该用户没有任何地址,应该返回什么?一个空对象 {}404 状态码? 204 状态码?

我认为空对象是一致的?

谷歌搜索,我找到了this 说:

返回给定召唤师 ID 的联赛或球队的调用现在将返回 404 而不是空对象。当请求的资源(即联赛或球队)不存在时,此行为是正确的 RESTful 行为。

所以我对正确的 RESTful 行为应该是什么感到有点困惑。

谢谢!

【问题讨论】:

  • 如果地址资源不存在,而客户端请求它(因为对资源状态的错误认识),客户端出错,这就是404
  • @IlioCatallo:但是客户应该怎么知道这个特定用户有没有地址?
  • 按照 HATEOAS 约束的规定,我将通过使用从客户端资源到地址资源的超媒体控件来明确关系
  • 我认为没有任何规则可以严格回答您的问题,但我个人会返回 200 或 204,因为请求成功。用户没有地址这一事实是另一点,但不应成为返回 http 错误状态的理由。除非地址是数据库中不可为空的字段。

标签: rest asp.net-web-api


【解决方案1】:

我认为404 应该来自请求一个不存在的地址。事实上,如果地址资源不存在,而客户端请求它(因为对资源状态的错误了解),则客户端犯了错误。

关于您关于发现给定用户是否具有关联地址的观点,我将根据HATEOAS 约束的规定,使用从客户端资源到地址资源的超媒体控件来明确关系。

此外,地址资源是一个弱实体 w.r.t.对应的用户。因此,对于这两种情况,返回 404 是有意义的。您仍然可以利用 HTTP 实体主体来更好地解释发生了什么。

【讨论】:

  • 为什么 /users/999/posts 应该返回一个空数组而不是 404 错误呢?这是我不明白的区别......
  • 恕我直言,如果用户没有帖子——但客户端仍然要求它们(因为它错误地认为她有)——服务器应该返回404。总的来说,我会尽量利用 HTTP 提供的统一接口。
  • @IlioCatallo IMO 这种方法给消费者(和 API)带来了额外的负担。他们需要编写代码来检查 404,而不是遍历一个空列表;我不确定从 404 中获得了什么好处。我发现区别在于您要的是集合而不是集合中的特定项目。
【解决方案2】:

站在消费者的角度考虑,他们是宁愿在没有地址的情况下使用相同的代码,还是必须为没有地址编写一个特殊情况?

我返回一个空集合,因为它对消费者(以及 REST 服务,但这是一个好处)的工作量较少。

如果请求是 /users/999/addresses 并且用户 999 不存在,我会返回 404

编辑:如果 /users/999/address 是资源的规范地址(也就是说 /users/999/address/1 是不正确的),那么我会返回 404,因为用户请求了一个具体而精确的地址东西。

【讨论】:

  • 我同意列表,这是我的第二个要点。我问的是什么时候返回的是一个对象,而不是一个集合
  • 我已经更新了我的答案。我在 REST 中发现的一件事是没有一种真正的方式。有许多不同的和激烈争论的反对意见。我得到的最佳建议是,无论您选择什么,都要在您的 API 中保持一致。
猜你喜欢
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多