如何设计RESTful集合资源?
我正在尝试设计一个“项目集合”资源。我需要支持以下操作:如何设计RESTful集合资源?,rest,Rest,我正在尝试设计一个“项目集合”资源。我需要支持以下操作: 创建集合 删除集合 将单个项目添加到集合中 将多个项目添加到集合中 从集合中删除单个项 从集合中删除多个项目 这就是我所做的: 创建集合: ==> POST /service Host: www.myserver.com Content-Type: application/xml <collection name="items"> <item href="item1"/> <item href="i
==>
POST /service
Host: www.myserver.com
Content-Type: application/xml
<collection name="items">
<item href="item1"/>
<item href="item2"/>
<item href="item3"/>
</collection>
<==
201 Created
Location: http://myserver.com/service/items
Content-Type: application/xml
...
==>
DELETE /service/items
<==
200 OK
==>
DELETE /service/items/item1
<==
200 OK
==>
邮政/服务
主持人:www.myserver.com
内容类型:application/xml
删除/服务/项目
删除/服务/项目/项目1
最好使用非位置标识符,例如集合项的UUID,以避免在删除位于其前面的项时出现诸如项的url更改之类的问题。(当然,您仍然可以使用itemN
或仅使用N
,只要数字始终附着在同一个项目上,在删除后留下空白,但UUID就不会那么混乱。)
该集合具有url/service/items/
。每个项目都有url/service/items/
创建项目和集合是在资源的父级上发布的。
如果客户端有权并且能够生成资源的名称或id,则可以使用PUT
删除项目和集合是对资源本身的删除
添加多个项目可以是在父项(集合)上的多个帖子或多个项目帖子
删除多个项目是对每个资源的删除。我不鼓励多项目删除,原因有两个:
批量删除是一项危险的操作(因此,我也不鼓励对非空集合进行删除)
该操作唯一有意义的目标是父集合,因此使批量删除相对于单个项删除是不对称的
如果您确实需要批量删除功能,请通过另一个明确标记的API(如PURGE/service/items)提供该功能。要将项目添加到集合中,请将其发布到集合的URL(http://myserver.com/service/items
)。在您的例子中,您已经有了XML中的“多项”表示,只需发布即可
我不知道在一次操作中删除多个项目的简单方法。。。你可以在收藏的物品上放上一个要保留的id列表。这个想法是PUT更新容器,所以不存在的内容会被删除。而且,我认为提供您想要保留的全部数据是没有用的,只提供项目的引用。创建元素的PUT有什么错?您引用了HTTP RFC,但据我所知,HTTP RFC并不排除使用PUT在集合中创建元素。如果我遗漏了什么,请写一个具体的引文,并附上摘录
PUT和POST创建元素的关键区别:
PUT应该是幂等运算;邮政不是
要在单个事务中删除多个元素,可以将DELETE发送到指定范围的URL(/service/items/13-20),也可以将DELETE发送到/service/items并使用HTTP范围标头(请参阅RFC2616第14.35.2节)。通常情况下,范围标头被控制为表示字节范围,并用于GET请求,但在删除时推断范围的含义取决于您的资源。为什么不使用规范并遵守其中编写的决定?这样新客户端就可以轻松地使用您的数据(使用GData库..简单)页面数据提要和GET/POST/PUT/DELETE的符号都有明确的定义。仅我的$0.02。使用内容类型/text/uri列表,并使用PUT、GET、PATCH和DELETE列表进行管理
指向要收集的资源的链接数
您需要的补丁格式可能非常简单:只需在前缀中加上“+”或“-”即可,这是每个uri给集合带来的更改的形式。
不幸的是,据我所知,这种媒体类型(可能被命名为text/uri list update)尚未正式注册。我读过的设计此类API的最佳系列文章之一:RFC建议在PUT请求中发送的数据应独立于uri中已经存在的数据进行解释。即,客户端必须再次发送完整的有效负载,该有效负载将替换为URI处的现有数据。例如,如果集合包含item1、item2、item3,并且我们需要添加另一项(item4),则PUT请求的有效负载不应仅包含item4,还应包含item1、item2、item3、item4,如果集合中存在大量项,则这些项的效率将很低。是的,对于PUT,您必须指定当前资源的完整内容。但是,不必指定其他资源的内容。如果调用PUT on/service/items/4,则您不需要指定item2或item3的内容。如果您想将多个项目添加到容器中,为什么不使用PATCH
方法?这将允许保留现有项目。否则,只需对每个项目执行单独的POST
调用(但对于批量添加,我肯定希望使用PATCH
)执行PUT
而不是POST
听起来是批量更新/创建的好方法。我喜欢:)我对XML有仇视,尤其是对API。而不是多项目POST
,您可以PUT
将项目集合放到/service/items
中,前提是API知道没有标识符的PUT
意味着您替换整个集合。对于附加内容,您可以使用PATCH
我刚刚读到,集合URI必须有尾随斜杠,否则在尝试解析relagive URI时,所有内容都会破坏。因此,您不应该使用/service/items
来处理集合,而应该使用/service/items/
。阅读相关内容。通过删除每个资源上的多个项目会在给定的存储库中产生许多删除查询。我认为这相当低效。有即兴表演吗