我试图围绕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
我找到了我正在阅读的书的在线链接...它区分了两者:
答案 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期待他们。
所以,如果我想要一个静止的集合,我应该链接到集合的网址,而不是嵌入集合。另一种方法是嵌入一系列链接,但是当列表很大时(虽然不是其他合同),这违反了社会契约。