REST - 同一资源的多个URI(???)

23 rest uri

我正在写一篇关于为大学的研究论文实现REST服务的论文,我在理解URI和资源之间的关系时遇到了一个小问题.

它说,资源可能有一个或多个URI.所以这是我的问题.我想使这项服务非常容易使用并绕过信息:应该从不同的入口点访问资源,但这违背了每个"URI指定一个资源"的概念.

所以我的问题是,如果以下是它或不符合REST的以下内容:

我想公开有关研究出版物的信息(让我们说同行评审).

这可以通过此URI访问:UNIVERSITY/publications/{my_publication}.

但是,由于这篇论文是由一位在社会科学系工作的研究人员撰写的,因此该出版物也有这个URI的意义:大学/学院/社会科学/出版物/ {my_publication}.

此外,由于该服务还暴露了在大学工作的所有研究人员(例如大学/研究人员/ {my_researcher}),因此该出版物可以命名为大学/研究人员/ {my_researcher}/publications/{my_publication}也是有意义的.

这可以继续使用多个用例,但你明白了.

这是否与REST一致?

我可以保留这个并通过发送响应代码303("另请参阅")以及规范URI(即大学/出版物/ {my_publication})来解决困境.

先感谢您!

Pet*_*ham 27

它说,资源可能有一个或多个URI.所以这是我的问题.我想使这项服务非常容易使用并绕过信息:应该从不同的入口点访问资源,但这违背了每个"URI指定一个资源"的概念.

不,不."每个手指完全属于一只手"并不意味着"每只手只有一根手指"."每个URI都指定一个资源"并不意味着"每个资源都由一个URI指定".

也就是说,重定向到规范的URI会改善一些用例(例如,两个用户将同一篇论文加入书签,从不同的查询到达那里).

您似乎也在考虑通过层次结构模式构建URL,而不是关于REST的任何内容.REST应用程序使用"超文本作为应用程序状态的引擎".URI的形式无关紧要,重要的是它可以从应用程序入口点返回的表示中导航.Fielding在他的博客中明确表示REST API必须是超文本驱动的,作为反模式导致客户端和服务器之间的耦合:

REST API不能定义固定资源名称或层次结构(客户端和服务器的明显耦合).

  • 男孩,我希望你稍微扩展最后一段. (3认同)
  • @ScottCher在REST应用程序中,应用程序的状态由用户代理通过URL获取资源来表示.REST将应用程序视为状态机,其中每个状态都是解析URL以检索资源的结果; 资源中的链接是到下一个可能状态的转换.使链接具有特定的人类可读模式与REST本身无关,只是指向应用程序的下一个状态的链接位于为当前状态检索的资源内.具有相同URL所表示的相同状态有助于...... (3认同)
  • ...书签,但有一个用户可以猜测的模式有点反REST - 这意味着用户可以猜测一个URL,输入它并跳转到不属于他们工作流程的应用程序状态.对于很多情况,这不是一个问题,其中状态不依赖于从给定路由到达,因此相当多的REST应用程序允许它.具有良好的人类可读模式具有优势,但不是REST的要求. (2认同)
  • 有趣的是——有相当多的内容是相反的,建议 URI 应该是可修改的。有些人可能比其他人更进一步地理解这个概念,例如 http://redrata.com/restful-uri-design/ 。感谢您的澄清。 (2认同)

Dar*_*ler 13

这是一个经常被争论的主题,我认为混淆是基于试图理解HTTP URI实际指向的内容.根据我的阅读,这成为一个非常毛茸茸的话题,人们的方式比我自己多年来在这个问题上的辩论更聪明.

是关于http-range-14问题的所有讨论的摘要页面.

我对该问题最终结论的天真解释是,应该只有一个URI返回带有200的物理"信息资源".但是,可以有许多URI将资源称为纯概念.返回303允许您将概念链接到"信息资源".

所以答案是肯定的,不是,同一资源可以有多个URI,并且所有URI都有效用于表示概念,但实际上只有一个应该返回物理表示.

这与Roy Fielding最近在谈论在URI中使用".xml"和".json"时的评论是一致的.他非常清楚地说明http://www.example.org/myresource.xml并且http://www.example.org/myresource.json正在引用两个不同的资源,因为它们都返回200.但是,当您使用内容协商时,http://www.example.org/myresource您可以检索同一资源的两个不同表示.


Jim*_*ans 7

虽然每个发布资源应该只有一个资源名称(URI),但您可以自由创建查询资源并返回其他资源名称列表.

您可以使用UNIVERSITY/publication/{publication}作为发布资源的资源名称模式,以及UNIVERSITY/faculties/{faculty}/publications作为特定功能的发布列表的命名资源的模式.同样UNIVERSITY/researchers/{researcher}/publications可以是特定人员撰写的出版物列表的资源名称模式.


dan*_*ben 1

它表示,一种资源可以有一个或多个 URI。所以这是我的问题。我想让这个服务非常易于使用并绕过信息:应该从不同的入口点访问资源,但这违背了每个“URI 指定一个资源”的概念。

我不认为这里有任何矛盾。一个 URI 最多可以指向一个资源,但多个 URI 可以指向同一个资源。URI 和资源之间的多对一关系(如果您愿意的话)。

也就是说,我不会太担心您的应用程序是否是 RESTful。这只是一个设计原则。这是一篇不错的文章,作者认为 REST 并不是真正适合使用 Web 浏览器的人类: http://starkravingcoder.blogspot.com/2009/01/where-are-rest-frameworks.html