【问题标题】:What are nested resources and where do they come from?什么是嵌套资源,它们来自哪里?
【发布时间】:2020-09-20 22:02:47
【问题描述】:
对于我的论文,我需要子资源(或嵌套资源)的精确定义。
我读了Fieldings Disseration,他确实介绍了术语资源和资源标识符,但他没有介绍术语子资源。
这是一个子资源的例子,但实际上为什么呢?
/posts/:postId/comments/:commentId
好吧,一个任意的帖子实例可以有一组 cmets,但是这个帖子实例应该由路径参数表示为子资源还是可以硬编码?
假设我有一个类似的 URI
/account/status
状态属于该帐户。是子资源吗?
提前致谢
阿米特
【问题讨论】:
标签:
rest
nested-resources
【解决方案1】:
REST 中没有子资源的概念。每个资源都独立存在,uri 应该是不透明的/不相关的,除非出于美学和文档的目的。您应该能够将资源的位置更改为不同的名称,甚至是不同的服务器,并且不应该影响关系。
资源之间的关系不是由它们的uris定义的,而是由它们之间的链接定义的(本文称为超媒体关系)。
该链接的外观取决于格式。在 HTML 中,它可能看起来像:
<a href="/child" rel="item">...</a>
<a href="/parent" rel="collection">...</a>
编码为 HTTP 链接:
Link: rel="item"; </child>
编码为 HAL:
{
_links: {
item: { href: '/child'}
}
}
【解决方案2】:
具有“下属”的资源是一个古老的 HTTP/1.0 理念,请参阅RFC 1945。
POST 方法用于请求目标服务器接受请求中包含的实体作为 Request-Line 中 Request-URI 标识的资源的新下级。
发布的实体从属于该 URI,就像文件从属于包含它的目录一样,新闻文章从属于发布它的新闻组,或者一条记录从属于数据库。
您会发现该语言被继承到 HTTP/1.1 (RFC 2616),但在最新规范中被放弃了(请参阅 RFC 7231)。
如果您正在寻找“子资源”或“嵌套资源”的“权威”定义,那么您需要研究旨在支持通用路由的标识符拼写约定要求。例如,JaxRS 或 Rails
资源在逻辑上是其他资源的子资源是很常见的……嵌套路由允许您在路由中捕获这种关系。
这些纯粹是实现细节,因为它们存在于源服务器提供的 HTTP 外观之后。通用客户不了解这些设计约束,因此无法从中获益。例如,如果您查看当前的 HTTP 缓存规范,您会注意到 invalidating 资源对可能也在缓存中的任何“子资源”完全没有影响。
但是选择一个将机械hierarchical part 与逻辑资源层次结构对齐的 URI 设计意味着您可以将资源视为对象图,这在某些情况下会减轻维护负担。
只是因为整个混乱还不够混乱,我们也有secondary resources的想法
URI 的片段标识符组件允许通过引用主要资源和附加标识信息来间接标识次要资源。
这里的关键思想是辅助资源的表示包含在主要资源的表示中。想想“网页中的 HTML 表单”。
【解决方案3】:
子资源是你调用的任何包含嵌套结构的东西,例如,如果你有一个包含嵌套评论对象的帖子对象,你可以说评论是帖子的子资源,想想它作为资源(对象)的层次结构,其中可以包含对象。
post = { #main resource at /post/:post
"post_id": "001",
"comments": { #sub-resource at /post/:post/comment/:comment
"comment_id": "001"
},
...
}
现在已经澄清了,这完全取决于您在应用程序中设置资源层次结构,这样您最终可能会得到很多子资源或根本没有。