如果客户端请求我的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应该工作。)
答案 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。