嵌套资源符合RESTful原则吗?

3

当涉及到嵌套资源表示(例如作者的书籍列表)时,REST API中嵌套资源表示在架构上有多么可靠且符合行业标准?

我希望能找到权威来源的链接来回答这个问题。

2个回答

3

REST的权威来源是Roy Fielding的论文dissertation,该论文基于他在1990年代HTTP/1.1标准化过程中所做的工作(RFC 2068RFC 2616等)。

资源是REST的定义(“任何可以被命名的信息都可以成为资源...”),并要求所有资源以相同的方式理解消息(统一接口),但实际上并不限制您的资源模型。

"RESTful" 一词在历史上具有上下文敏感性;实际上它的意思是“更像 REST,而不是我们当前的设计”。在Web服务社区中,“更像 REST” 意味着“比 WS-* 和 SOAP 更像 REST”。在Rails中,“更像 REST” 意味着比Rails 1.2之前推荐的资源模型更像 REST。等等。
如果您感兴趣的是描述一个集合资源和该集合中项资源之间的关系,则您需要的标准是 RFC 6573
但是,它并不告诉您如何设计这些资源,或者如何为这些资源设计标识符 - 它只告诉您如何指示它们之间的关系。

1
据我所理解,Web资源是通过Web访问的IRI标识的抽象概念。解引用IRI所返回的是已识别资源的实际状态表示,这就是为什么它被称为表现层状态转移。我不记得有任何标准讨论嵌套资源。也许RDF是你要找的最接近的东西。在实践中,如果我们遵循RDF概念,那么为了响应GET请求,REST API将返回以给定IRI标识的资源为起点的RDF子图的表示形式,它可以是任意深度。嵌套性在这里并不是我考虑的问题,因为它是一个图形而不是一个层次结构,它是一种展开资源之间关系或返回超链接的方式,API消费者可以按照相同的方式执行相同的操作。
不确定这是否有所帮助。我没有找到除了VoiceOfUnreason的答案所包含的RFC之外的任何RFC,我记得5年前有一篇RFC明确介绍了使用哈希标签或不可引用的IRI来识别网络资源和真实事物,但我不知道那是哪一篇。也许是VoiceOfUnreason建议的Lanthaler dissertationSemWeb document。但可以确定的是,它与语义Web和RDF有关。
REST对资源的识别约束要求资源是可识别的,以便可以通过通用接口访问和操作资源。在Web上,资源由IRI [44]标识。由于资源可能代表无法序列化为字节流的概念(例如人或感觉),因此不能直接操作资源。相反,REST是建立在通过表示层间接操作资源的概念上的;即,引入了资源表示形式的另一层间接性。

https://www.markus-lanthaler.com/research/third-generation-web-apis-bridging-the-gap-between-rest-and-linked-data.pdf

在语义网上,所有信息都必须表示为关于资源的陈述,例如公司 Example.com 的成员是 Alice 和 Bob,Bob 的电话号码是“+1 555 262”,或者这个网页是由 Alice 创建的。资源由统一资源标识符 (URIs) [RFC3986] 标识。这种建模方法是资源描述框架 (RDF) [RDFPrimer] 的核心。N3 primer[N3Primer] 提供了一个不错的介绍。

使用 RDF,这些陈述可以发布在公司的网站上。其他人可以阅读数据并发布自己的信息,链接到现有资源。这构成了一个分布式的世界模型。它允许用户选择任何应用程序来查看和处理相同的数据,例如在您的地址簿中查看 Alice 的发布地址。

https://www.w3.org/TR/cooluris/#semweb

我想说的是,HTTP响应中所看到的并不是资源本身,而只是它的表示形式以及与其他资源的关系。
REST没有规定响应必须有多么详细,它只要求使用超链接连接资源,并使用标准MIME类型和文档化API。至少这是我对统一接口约束的理解。
我认为这个问题非常好,因为这部分架构是开放的,在过去的几年中有很多问题问如何使用URI查询嵌套资源。答案总是REST不涵盖它,URI和URI模板标准也不涵盖它。有一些标准,如OData和Hydra,提供了建议,但最终还是由你决定。你的问题与此相关,因为它询问这样一个查询的响应可以有多么详细。据我所知,这也没有被覆盖,但可以确定的是,它必须至少包含指向其他资源的超链接。RDF允许在单个文档中描述多个资源,因此如果我们将RDF方法扩展到REST,它并没有禁止这样做,那么我想我们可以这样做。
从实际角度来看,例如集合也是一种嵌套资源,如果API消费者为了了解基本信息(如产品名称)而为每个集合项发送专用请求,那么这将浪费资源。通常,我们会以一个HTTP响应或多个页面上的25-50-100个项目来回应这种请求。从可用性和可扩展性的角度来看,为每个项目提供超链接并强制用户逐个跟随这些链接是没有多大意义的。事实上,我们喜欢以消费者需要的确切视图模型来响应,并以此设计API。我认为嵌套属性也是如此。从RDF的角度来看,这些响应代表了由REST服务和例如RDF词汇维护者(如OWL、Schema.org等)管理的巨大资源图形的子图。

因此,简单回答:REST不涵盖“嵌套资源”的表示方式,据我所知,标准(如HTTP和URI)也不涵盖,但目前使用它们是最佳实践,我们经常用于REST的MIME类型,如HAL+JSON或RDF/JSON-LD也支持嵌套表示,所以我会说是的。


也许是:https://www.w3.org/TR/cooluris/#semweb? - VoiceOfUnreason
@VoiceOfUnreason,那是类似的东西,但我不确定。顺便感谢你提供的链接,我会保存它的。 - inf3rno
@VoiceOfUnreason 也许是Lanthaler的论文:https://www.markus-lanthaler.com/research/third-generation-web-apis-bridging-the-gap-between-rest-and-linked-data.pdf 如果有人喜欢REST,这是一篇不错的阅读材料。 - inf3rno
@inf3rno,非常感谢您提供如此详细的信息,奖励将由我来支付(一旦问题的悬赏金可用)。 - Gill Bates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接