【问题标题】:Updating more than one item in a RESTful way以 RESTful 方式更新多个项目
【发布时间】:2015-11-30 08:36:56
【问题描述】:

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

典型示例:有一个项目列表,即收到邮件的收入文件夹,您可以通过设置相应的复选框来选择其中一组。然后单击“删除”按钮并发送删除它们的请愿书。我应该调用什么方法?什么参数?

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

【问题讨论】:

  • PATH方法你是说PATCH吗?另外,谁说这些方法一次只允许一个项目?
  • 在我们的项目中,我们有两种方法:第一种:发送 n DELETE(删除)或 n PUT(移动)请求以(某种)保持一致。第二:在团队中讨论这个用例是否适合我们所说的“自定义操作”。这些自定义操作被“滥用”POST 请求。例如:POST users/move/{groupid},它接受一个用户 ID 列表作为正文并将它们全部移动到所需的组。使用什么解决方案的标准基本上是“这个功能多久使用一次?”这个问题。 - 如果不是核心功能我们选择第一个,如果它经常使用我们选择第二个。
  • @TimCastelijns PATH 一次是否只允许一个项目?这就是我想到的地方:restcookbook.com/HTTP%20Methods/patch。如果您有其他文档资源,请告诉我
  • 不,取决于服务器是如何实现的,如果它可以在1个请求中处理多个资源,那么你可以使用那个
  • @TimCastelijns 好的,那么语法是什么?

标签: rest


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多