我正在尝试理解 REST 中“集合”和“存储”之间的区别。从我到目前为止所读到的内容来看,
集合是:
"a server-managed directory of resources"
商店是:
"client-managed resource repository"
我找到了这篇文章:“存储”REST 原型如何不创建新资源和新 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
我找到了我正在读的书的在线链接......其中区分了两者:
REST 使用 http 动词来操作资源。句号。就是这样。为了构建某些类基于浏览器的应用程序,开发人员有时会使用本地存储(
store
),但这与 REST 完全无关(事实上,恰恰相反)。在基于 REST 的 API 设计中,集合是一个特殊的考虑因素,因为 REST 原则对它们在查询结果中的表示方式施加了相当大的限制——特殊的考虑因素还在于,如果您需要如何表示和访问这些东西,则没有标准。使用 html 以外的任何内容作为资源类型。
那么,收藏呢?
让我们以一个大学管理系统为例,该系统具有
Course
对象,每个对象都包含大量学生列表。
当我
GET
course
时,我不想将 students
的集合作为嵌入列表返回,因为这可能很大,而且我的用户可能不感兴趣。相反,我想知道 course
有一个 students collection
并且我希望能够单独查询该集合(当我需要时)并且我希望能够按需对其进行分页。为此,course
需要链接到 students collection
URL(也许使用适当的类型,以便我的代码知道如何处理该链接)。然后,我想使用给定集合的 url 来请求资源的分页列表。在此示例中,集合的 url 可能类似于:course/1/students
,按照惯例,我可以将分页信息添加到搜索字符串,以使用类似 course/1/students?page=1&count=10
的内容来限制结果。将 students collection
嵌入到 course
资源中将违反 REST。我不会退货 course
,我会退货 course-and-students
。
据我了解,集合就像 sql 中的表 - 我们可以在集合(行)内创建新资源。
相反,商店就像编程中的集合数据结构 - 我们可以添加/删除项目,但不能创建新的资源(项目)。它们已经被创建了。