以RESTful方式更新多个项目

时间:2015-11-30 08:36:56

标签: rest

尝试更新/删除多个项目时,正确的RESTful方法应该是什么?

典型示例:有一个项目列表,收到的邮件收入文件夹,您可以通过设置适当的复选框选择一组。然后单击“删除”按钮并发送删除请求。我应该用什么方法打电话?什么参数?

在这种情况下很明显我应该使用DELETE,但它只能同时使用一个项目。此外,我可能不想删除它们,而是将它们存储在不同的文件夹中,这可能意味着使用PATCH,但是再次,PATCH方法只允许一个项目。

2 个答案:

答案 0 :(得分:2)

  

在这种情况下很明显我应该使用DELETE,但它只是   一次使用一个项目。另外,我可能不想删除它们,   但将它们存储在不同的文件夹中,这可能意味着使用了   PATCH,但是再一次,PATCH方法只允许一个项目。

您应该修复集合(或其中的一部分)而不是项目。例如,通过移动项目,您可以使用PATCH /collection/?filter=x {location: newDir}。 DELETE是一个棘手的问题。您可以使用PATCH或替代方法来使用DELETE /collection/?filter=x,但这意味着您要删除集合资源,而不是从中删除项目资源。通过批量创建,我认为使用POST /collection/ [item1, item2, ...]是可以的。

OFC。您也可以使用备用URI结构,例如PATCH /books/1+2+3/ {price: 20, currency: "EUR"}。 PATCH还有一种替代语法,您可以将操作名称添加到正文中,例如PATCH /collection/?filter=x {op: "update", location: newDir}。我不喜欢这样,但是如果你想重用具有相同URI的PATCH,那么它就会变得很方便。将请求发送到单个批处理端点的另一种方法,例如POST /transactions/并使用多部分HTTP请求。

我认为这里要记住的最重要的部分是,您正在做的是将多个操作强制转换为单个事务。因此,如果您不需要立即一致性,并且丢失请求之间的连接不是问题,那么客户端可以使用简单的循环并行或串行发送多个请求。

答案 1 :(得分:1)

您可以使用矩阵参数进行删除。鉴于参数是资源ID,您可以使用未命名的参数,因此例如DELETEhttps://host.com/messages/1;2;3将删除ID为1,2和3的邮件。