如何设计RESTful集合资源?

时间:2010-05-11 12:32:18

标签: rest

我正在尝试设计一个“物品集合”资源。我需要支持以下操作:

  1. 创建集合
  2. 删除集合
  3. 将单个项目添加到集合
  4. 向集合添加多个项目
  5. 从集合中删除单个项目
  6. 从集合中删除多个项目
  7. 这就是我已经走了:

    创建集合:

    ==>
    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
    

    但是,我发现支持其他操作有点棘手,即我可以使用哪些方法:

    • 向集合中添加单个或多个项目。 (根据HTTP 1.1 RFC
    • ,PUT似乎不在此处
    • 在一个交易中从集合中删除多个项目。 (DELETE似乎也不在这里)

5 个答案:

答案 0 :(得分:24)

最好使用非位置标识符(例如UUID)来收集项目,以避免在删除项目前面的项目时更改项目的网址等问题。 (当然,您仍然可以使用itemN或仅N,只要数字始终与同一项目相关联,在删除后留下空白,但UUID不会混淆。)< / p>

该集合包含网址/service/items/。每个项目都有网址/service/items/<id>

  1. 创建项目和集合是资源父项的POST。
    1. 如果客户有权生成资源的名称或ID,则可以使用PUT。
  2. 删除项目和集合是资源本身的DELETE。
  3. 在父(集合)上添加多个项目是多个POST或多项目POST。
  4. 删除多个项目是每个资源上的DELETE。我会劝阻多项DELETE有两个原因:
    1. 批量删除是一项危险的操作(出于这个原因,我也会在非空集合上阻止DELETE)。
    2. 该操作唯一有意义的目标是父集合,因此相对于单项DELETE,批量DELETE不对称。
  5. 如果您确实需要批量删除功能,请通过不同的,明确标记的API提供,例如PURGE / service / items。

答案 1 :(得分:1)

要将项目添加到集合中,请将它们发布到集合的URL(http://myserver.com/service/items)。在您的情况下,您已经在XML中有一个“多项”表示,只是POST。

我不知道在一次操作中删除多个项目的简单方法...您可以将PUT添加到集合的项目中,并保留要保留的ID列表。 PUT更新容器的想法是什么,所以没有删除。并且,我认为提供您想要保留的整个数据没有用,只是提供项目的参考。

答案 2 :(得分:1)

PUT创建元素有什么问题?您引用了HTTP RFC,但据我所知,HTTP RFC并不排除使用PUT在您的集合中创建元素。如果我错过了什么,请做一个特定的引用,并摘录。

创建元素的PUT和POST之间的主要区别:
PUT应该是幂等操作; POST不是。

要删除单个事务中的多个元素,可以将DELETE发送到指定范围的URL(/ service / items / 13-20,或者可以将DELETE发送到/ service / items并使用HTTP Range标头(请参阅RFC2616 sec.14.35.2。。通常情况下,范围标头被构造为暗示字节范围,并在GET请求中使用,但是由您的资源决定DELETE上RANGE的含义。

答案 3 :(得分:0)

为什么不使用AtomPub规范并坚持写在那里的决定?这样,新客户端可以轻松地使用您的数据(使用GData库...简单),并且可以明确定义分页数据源和GET / POST / PUT / DELETE的语义。只是我的$ .02。

答案 4 :(得分:0)

使用Content-Type / text / uri-list并使用PUT,GET,PATCH,DELETE列表进行管理 链接到您要收集的资源。

您需要的PATCH格式可能非常简单:只需在“+”或“ - ”前加上每个uri为集合带来的更改模式。 不幸的是,根据我的知识,这种媒体类型可能被命名为text / uri-list-update,尚未正式注册。