首页 > 解决方案 > REST GET 的 HTTP 响应代码 - 未找到子资源(但未由标识符引用)

问题描述

我正在构建一个 REST API,并且在将响应代码返回到 GET 操作时遇到了两难境地。我在网上找到了许多示例和答案,但不适用于我的特定场景。以下是我到目前为止发现和理解的内容:

  1. 如果返回一个空列表(比如/library/authors/{authorId}/books)一个响应代码为 200 的空列表就足够了

  2. 如果请求具有 id 的特定资源(例如/library/authors/{authorId}/books/{bookId}),则响应将为空,并带有 404

这总结了我的大部分用例,我很好。

但是,如果我访问没有 id 的子资源会发生什么?

例如,为了争论,假设作者可以有很多书,但只有一本自传。他要么有一个,要么没有。我不希望用户传入自传 id,因为系统可以自行判断是否存在,端点是这样的:

获取 /library/authors/{authorId}/auto-biography

如果作者存在但他没有自传(为NULL),http响应代码是否为:

先感谢您!

标签: resthttpnullresponse

解决方案


通过语义工作

GET /library/authors/1/auto-biography

/library/authors/1/auto-biography是一个标识符。资源本身就是“作者1的自传”之类的概念;请注意,即使它实际上可能还不存在,我们也可以谈论该资源。

资源可以映射到空集,这允许在对该概念的任何实现存在之前对该概念进行引用

HTTP 响应正文中出现的不是资源,而是资源的表示

所以现在看看状态码

404

404(未找到)状态代码表示源服务器没有找到目标资源的当前表示或不愿意透露存在的表示。

204

204(无内容)状态代码表示服务器已成功完成请求,并且响应负载正文中没有要发送的其他内容。

一个松散的类比:假设您尝试获取文件的内容。 404在语义上与 FileNotFound 对齐;204表示文件的长度为零字节。

404通常会伴随“包含对错误情况的解释的表示,以及它是暂时的还是永久的情况”。它表明客户端尝试使用不应该可用的链接。

204,另一方面,什么都没有——表示是零字节长,怎么会有数据。这是响应的一个特例200,通知客户端(和中间组件)响应主体是故意留空的。


推荐阅读