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

时间:2009-12-18 16:40:00

标签: rest uri

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

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

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

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

此URI可以访问:大学/出版物/ {my_publication}

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

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

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

这是否与REST一致?

我是否可以通过发送响应代码303(“另请参阅”)以及规范URI(即大学/出版物/ {my_publication})来解决这个难题。

提前谢谢!

6 个答案:

答案 0 :(得分:25)

  

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

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

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

您似乎也在考虑通过层次结构模式构建URL,而不是关于REST的任何内容。 REST应用程序使用“超文本作为应用程序状态的引擎”。 URI的形式无关紧要,重要的是它可以从应用程序入口点返回的表示中导航。 Fielding在他的博客REST APIs must be hypertext-driven中明确指出这是一种反模式,导致客户端和服务器之间的耦合:

  

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

答案 1 :(得分:11)

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

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

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

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

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

答案 2 :(得分:6)

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

您可以将UNIVERSITY/publication/{publication}作为发布资源的资源名称模式,将UNIVERSITY/faculties/{faculty}/publications作为命名资源的模式,这些资源是特定院系的发布列表。同样,UNIVERSITY/researchers/{researcher}/publications可以是特定人员撰写的出版物列表的资源名称模式。

答案 3 :(得分:0)

  

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

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

尽管如此,我不会因为你的应用程序是否是RESTful而烦恼不已。这只是一个设计原则。这篇文章是一篇很好的文章,他认为REST并不是真的适合那些使用网页浏览器的人:http://starkravingcoder.blogspot.com/2009/01/where-are-rest-frameworks.html

答案 4 :(得分:0)

+1 Jim Ferrans。

此外,每个资源只有一个URI可以更轻松地在您的网站中创建链接。我已经读过搜索引擎更喜欢不在不同URI上重复的内容。

答案 5 :(得分:0)

您需要查看资源与其代表的实体之间的区别。 Roy Fielding在他的dissertation, section 5.2.1.1写道:

  

资源是指向一组实体的概念映射,而不是   与任何特定点的映射对应的实体   时间。

由于您的所有资源都带有稍微不同的语义,因此我认为它可以被认为是RESTful。根据媒体类型的结构,您可以使用canonical link relation来表示"首选的uri"。