rest - REST GET 的 HTTP 响应代码 - 未找到子资源(但未由标识符引用)
问题描述
我正在构建一个 REST API,并且在将响应代码返回到 GET 操作时遇到了两难境地。我在网上找到了许多示例和答案,但不适用于我的特定场景。以下是我到目前为止发现和理解的内容:
如果返回一个空列表(比如/library/authors/{authorId}/books)一个响应代码为 200 的空列表就足够了
如果请求具有 id 的特定资源(例如/library/authors/{authorId}/books/{bookId}),则响应将为空,并带有 404
这总结了我的大部分用例,我很好。
但是,如果我访问没有 id 的子资源会发生什么?
例如,为了争论,假设作者可以有很多书,但只有一本自传。他要么有一个,要么没有。我不希望用户传入自传 id,因为系统可以自行判断是否存在,端点是这样的:
获取 /library/authors/{authorId}/auto-biography
如果作者存在但他没有自传(为NULL),http响应代码是否为:
- 204(空内容)
- 404(资源不存在)
先感谢您!
解决方案
通过语义工作
GET /library/authors/1/auto-biography
/library/authors/1/auto-biography
是一个标识符。资源本身就是“作者1的自传”之类的概念;请注意,即使它实际上可能还不存在,我们也可以谈论该资源。
资源可以映射到空集,这允许在对该概念的任何实现存在之前对该概念进行引用
HTTP 响应正文中出现的不是资源,而是资源的表示。
所以现在看看状态码
404(未找到)状态代码表示源服务器没有找到目标资源的当前表示或不愿意透露存在的表示。
204(无内容)状态代码表示服务器已成功完成请求,并且响应负载正文中没有要发送的其他内容。
一个松散的类比:假设您尝试获取文件的内容。 404
在语义上与 FileNotFound 对齐;204
表示文件的长度为零字节。
404
通常会伴随“包含对错误情况的解释的表示,以及它是暂时的还是永久的情况”。它表明客户端尝试使用不应该可用的链接。
204
,另一方面,什么都没有——表示是零字节长,怎么会有数据。这是响应的一个特例200
,通知客户端(和中间组件)响应主体是故意留空的。
推荐阅读
- c - Scanf 正在向数组寻址错误类型的变量
- javascript - 使用 CDN 时如何调用 react logger 函数
- html - 将一个固定的“箭头”元素居中于另一个固定的“圆形”元素中
- d3.js - 带有可扩展节点的图形,带有 D3
- r - 从 R 中具有 6 个未知数的 6 个非线性方程计算变量
- typescript - 在 Nest.js 中,如何在我的 API 响应中提供与我的 JSON 对象捆绑在一起的静态内容文件
- notepad++ - notepad++ 正则表达式删除标签内部/之间的空白空间并按字母顺序排序
- maven - 未能执行目标 org.scalatest:scalatest-maven-plugin:2.0.0:test (test)
- c++ - 这种右移是如何工作的:stringstream >> unsigned int >> unsigned int?
- javascript - XMLHttpRequest 中的超时和错误有什么区别?