REST中的集合和商店之间有什么区别?

时间:2015-01-08 18:58:06

标签: web-services rest soa

我试图围绕REST中“集合”和“商店”之间的区别。从我到目前为止所读到的,

一个集合是:

 "a server-managed directory of resources"

并且商店是:

 "client-managed resource repository"

我发现了这篇文章:How "store" REST archetype isn't creating a new resource and a new URI?

但它并没有真正帮助我澄清差异。我的意思是,我理解一个是由服务器控制而另一个是由客户端控制的......但有人可以给我一个具体的例子,说明商店在真实应用程序中的含义吗?

我认为它是这样的:

GET http://myrestapplication.com/widgets/{widget_id} -- retrieves a widget from db
POST http://myrestapplication.com/widgets/{widget_id} -- creates a new widget from db
PUT http://myrestapplication.com/widgets/{widget_id},[list of updated parms & their vals] -- update widget
PUT http://myrestapplication.com/users/johndoe/mywishlist/{widget_id} -- updates john doe's profile to add a widget that already exists in the database... but links to it as his favorite one or one that he wants to buy

这是对的吗? 如果是这样,最后的PUT是否也能以某种方式表示为POST?

编辑1

我找到了我正在阅读的书的在线链接...它区分了两者:

https://books.google.ca/books?id=4lZcsRwXo6MC&pg=PA16&lpg=PA16&dq=A+store+is+a+client-managed+resource+repository.+A+store+resource+lets+an+API+client:+put+resources+in,+get+them+back+out,+and+decide+when+to+delete+them&source=bl&ots=F4CkbFkweL&sig=H6eKZMPR_jQdeBZkBL1h6hVkK_E&hl=en&sa=X&ei=BB-vVJX6HYWvyQTByYHIAg&ved=0CB0Q6AEwAA#v=onepage&q=A%20store%20is%20a%20client-managed%20resource%20repository.%20A%20store%20resource%20lets%20an%20API%20client%3A%20put%20resources%20in%2C%20get%20them%20back%20out%2C%20and%20decide%20when%20to%20delete%20them&f=false

1 个答案:

答案 0 :(得分:1)

REST使用http动词来操纵资源。句号。就是这样。要构建一些基于浏览器的应用程序开发人员,有时会使用本地存储(store),但这与REST完全无关(事实上,它恰恰相反)。集合是基于REST的API设计中的一个特殊考虑因素,因为REST原则对它们在查询结果中的表示方式施加了相当大的限制 - 特别考虑因为没有关于如何表示这些事物的标准以及如果您&#的访问权限39;重新使用除html之外的任何东西作为资源类型。

<小时/> 编辑: REST规定当我们要求资源时,我们会收到该资源而只接收该资源,并且该资源引用的内容将作为链接返回,而不是作为数据返回。这模仿了我们返回所请求页面的http标准,并链接到其他页面而不是嵌入链接页面。因此,我们的资源应返回相关资源的链接,而不是资源本身。

那么,收藏呢?

让我们以大学管理系统为例,该系统的课程对象包含大量学生名单。

当我获取课程资源时,我不希望将学生集合作为嵌入列表返回,因为这可能是巨大的,因为我的用户可能不感兴趣。相反,我想知道该课程有一个学生集合,我希望能够单独查询该集合(当我需要时),并希望能够按需分页。为了使其工作,课程需要链接到具有适当类型的集合URL,以便我的代码(javascript)知道如何处理链接。然后,我想使用给定的集合的URL来请求分页的资源列表。在此示例中,集合url可能类似于:students?course=1,其惯例是我可以将分页信息添加到搜索字符串以约束结果(类似&page=1&count=10虽然为此使用标题是一个有争议的替代方案)

如果我要将学生的集合嵌入课程对象中,那么我会通过返回引用的资源而不是他们的网址来违反REST。如果我只是提供一个完整列表的链接,我不会违反REST,但我违反了社会契约,建议不要将大量集合返回到远程客户端,而不是#39期待他们。

所以,如果我想要一个静止的集合,我应该链接到集合的网址,而不是嵌入集合。另一种方法是嵌入一系列链接,但是当列表很大时(虽然不是其他合同),这违反了社会契约。