Jsonapi资源不存在:404或{“data”:null}?

时间:2018-03-26 19:22:02

标签: json rest hateoas json-api

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

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

并且该ID不存在Foo资源,我应该返回404错误代码吗?或者我应该以{{1​​}}的身体返回200?

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

但是当我阅读this passage from the JSONAPI spec时,我认为我应该返回{"data": null }

  

主要数据必须是:

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

因为这种情况似乎是针对单一资源。

在解析数据一节中说:

  

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

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

以及同一部分的下面是:

  当请求的URL是可能对应于单个资源但当前不对应的URL时,

null只是一个适当的响应。

我不清楚这是什么意思。

那是哪个以及为什么?

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

2 个答案:

答案 0 :(得分:1)

您链接的部分谈论'文档'。如果没有文件,那么所说的都不适用于答复。也:

  

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

请注意此处的“包含数据”部分。

返回404 Not Found

答案 1 :(得分:1)

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

1.0 specification特别提到:

  

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

引用的段落在{em>“获取资源” 下的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。