尝试更新/删除多个项目时,正确的RESTful方法应该是什么?
典型示例:有一个项目列表,收到的邮件收入文件夹,您可以通过设置适当的复选框选择一组。然后单击“删除”按钮并发送删除请求。我应该用什么方法打电话?什么参数?
在这种情况下很明显我应该使用DELETE
,但它只能同时使用一个项目。此外,我可能不想删除它们,而是将它们存储在不同的文件夹中,这可能意味着使用PATCH
,但是再次,PATCH
方法只允许一个项目。
答案 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,您可以使用未命名的参数,因此例如DELETE
到https://host.com/messages/1;2;3
将删除ID为1,2和3的邮件。