【问题标题】:Jsonapi resource is not present: 404 or { "data": null }?Jsonapi 资源不存在:404 或 {“data”:null }?
【发布时间】:2018-09-05 01:10:13
【问题描述】:

如果客户端从我的 REST 应用程序请求不存在的资源,例如

http://localhost:8080/app/foo/1

并且该 id 不存在 Foo 资源,我应该返回 404 错误代码吗?还是我应该返回 200 并带有 {"data": null } 的正文?

阅读this thread from ember data 让我觉得我应该返回 404。

但是当我读到this passage from the JSONAPI spec 时,我觉得我应该返回{"data " : null}

主要数据必须是:

  • 单个资源对象、单个资源标识符对象或 null,用于针对单个资源的请求
  • 资源对象数组、资源标识符对象数组或空数组 ([]),用于针对资源集合的请求

因为这个案例似乎针对的是单一资源。

在解析数据部分它说:

服务器必须以 200 OK 响应成功响应获取单个资源或资源集合的请求。

“成功”是什么意思?如果查询因为那里没有条目而没有找到任何东西,那么查询就会运行并得到准确的结果,那是否成功?

在同一部分的下面是:

只有当请求的 URL 可能对应于单个资源但当前不对应时,null 才是适当的响应。

我不清楚这应该是什么意思。

那么它是什么,为什么?

(这并不是专门针对 ember-data,我想澄清一下我应该做什么才能符合规范。我只提到了 ember-data,因为它似乎是一个工作参考实现jsonapi 应该可以工作。)

【问题讨论】:

    标签: json rest hateoas json-api


    【解决方案1】:

    我知道我迟到了,但我的回答可能对任何迷失的灵魂有用。

    1.0 specification 特别提到:

    [...] 服务器必须在处理请求以获取不存在的单个资源时以 404 Not Found 响应,除非请求需要以 @987654327 响应 200 OK @ 作为主要数据(如上所述)。

    引用的段落可在here,在“获取资源”下找到。具体来说,引用的最后一部分关于null的使用涉及到reachability的主题。

    最终,所有 REST API 都应该是超媒体驱动的。这里的关键字是“探索”。 JSON:API 允许通过链接探索整个资源图(参见规范中相应的section)。如果在回复 404 Not Found{"data": null} 之间存在疑问,请问问自己:您的 API 是否公开了任何指向相关资源的链接?

    • 如果是,这意味着请求在语义上是有效的,即使资源不存在或不包含任何数据,因此您应该使用{"data": null} 进行响应。例如,关系和相关资源通常可以从根资源的链接中获得,无论是否为空 - 都没有关系。

    • 如果不是,这意味着您的资源根本不存在,您应该回复404 Not Found。这方面的一个例子可能是/users/1234567890,其中没有{"id": 1234567890} 的用户。在获取/users 的公开列表时,它不会出现,因此,您将永远无法通过超媒体驱动的浏览访问该链接。

    总之,规范对此并不完全清楚,但意图很明确恕我直言。请记住,您毕竟是在设计 REST API。

    【讨论】:

      【解决方案2】:

      您链接到的部分谈论“文档”。如果没有文件,那里所说的一切都不适用于响应。另外:

      JSON 对象必须位于每个 JSON API 请求和包含数据的响应的根。

      注意这里的“包含数据”部分。

      返回404 Not Found

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        • 2016-07-16
        • 1970-01-01
        相关资源
        最近更新 更多