2015-01-08 142 views
0

我试图围绕REST中的“集合”和“商店”之间的区别来解决我的问题。从我至今读,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

这两个术语都不与REST相关联。你能为你的报价提供参考吗?您引用的帖子正在讨论特定书籍对REST的(不正确)解释。 –

+0

@EngineerDollery你做的有趣的评论。我引用了O'Reilly的REST API设计规则手册,第15页。我已经通过本书的链接更新了我的文章。请参阅“编辑1” – dot

回答

0

REST使用HTTP动词来操纵资源。句号。而已。构建一些基于浏览器的应用程序开发人员有时使用本地存储(store),但这与REST完全没有关系(事实上,情况正好相反)。在基于REST的API设计中,集合是一个特殊的考虑因素,因为REST原则对它们在查询结果中的表示形式有很大限制 - 特别考虑因素,因为没有关于如何表示这些东西的标准,重新使用html以外的任何资源作为资源类型。


编辑: REST决定,当我们问一个资源,我们收到的资源,只有资源,并通过资源引用的东西都返回链接,而不是数据。这模仿了我们返回所请求的页面和链接到其他页面而不是嵌入链接页面的http标准。所以,我们的资源应该返回到相关资源的链接,而不是资源本身。

那么,收集呢?

让我们用一个大学管理系统为例,该系统的课程对象包含大量的学生列表。

当我获得课程资源时,我不希望将学生的集合作为嵌入列表返回,因为这可能会很大,因为我的用户可能不感兴趣。相反,我想知道该课程有一个学生集合,我希望能够分别查询该集合(需要时),并且希望能够按需进行分页。为了这个工作,课程需要链接到集合url,并使用适当的类型,以便我的代码(javascript)知道如何处理链接。然后,我想使用给定集合的url来请求分页的资源列表。在这个例子中,收集的url可能是这样的:students?course=1,并约定,我可以添加分页信息的搜索字符串来约束的结果(如&page=1&count=10东西也许虽然使用标头,这是一个值得商榷的替代)

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

因此,如果我想要一个休息中的集合,我应该链接到集合的url,而不是嵌入集合。另一种方法是嵌入一系列链接,但是当名单很大时(虽然不是其他合同),这违反了社会契约。

+1

_收集是基于REST的API设计中的一个特殊考虑因素,因为REST原则对于它们在查询结果中的表现方式造成了相当大的限制_--您能否详细说明? – toniedzwiedz

+0

编辑我的答案 –

相关问题