如何设计RESTful集合资源?

Sur*_*mar 36 rest

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

  1. 创建集合
  2. 删除该集合
  3. 将单个项添加到集合中
  4. 将多个项添加到集合中
  5. 从集合中删除单个项目
  6. 从集合中删除多个项目

这就是我已经走了:

创建集合:

==>
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
...
Run Code Online (Sandbox Code Playgroud)

删除集合:

==>
DELETE /service/items

<==
200 OK
Run Code Online (Sandbox Code Playgroud)

从集合中删除单个项目:

==>
DELETE /service/items/item1
<==
200 OK
Run Code Online (Sandbox Code Playgroud)

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

  • 将单个或多个项添加到集合中.(根据HTTP 1.1 RFC, PUT似乎不在此处
  • 在一个事务中从集合中删除多个项目.(DELETE似乎也不在这里)

Mar*_*tos 24

最好使用非位置标识符(例如UUID)来收集项目,以避免在删除项目前面的项目时更改项目的URL等问题.(当然,你仍然可以使用itemN或只是N,只要数字始终保持附加到同一个项目,删除后留下空白,但UUID不那么令人困惑.)

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

  1. 创建项目和集合是资源父项的POST.
    1. 如果客户端有权生成资源的名称或ID,则可以使用PUT.
  2. 删除项目和集合是资源本身的DELETE.
  3. 添加多个项目是父项(集合)上的多个POST或多项POST.
  4. 删除多个项目是每个资源上的DELETE.我会劝阻多项DELETE有两个原因:
    1. 批量删除是一个危险的操作(出于这个原因,我也会阻止对非空集合的DELETE).
    2. 该操作唯一有意义的目标是父集合,因此使批量DELETE与单项DELETE不对称.

如果您确实需要批量删除功能,请通过不同的,明确标记的API提供,例如PURGE/service/items.

  • 假设API知道没有标识符的"PUT"意味着您替换整个集合,而不是多项"POST",您可以将项目集合"放入"/ service/items`.对于添加,您可以使用`PATCH` (2认同)