REST API 设计 - 使用请求 Body 删除多个项目

REST API Design - DELETE multiple items using request Body

我有一个 API 显示供应商产品

我们的 UI 将允许用户 select 各种过滤条件并使用它一次删除多个产品。

问题是执行几千个单独的 HTTP 删除请求花费的时间太长:

DELETE /api/supplier/6/products/5
DELETE /api/supplier/6/products/7
DELETE /api/supplier/6/products/8
DELETE /api/supplier/6/products/10
...

目的是进行一次 HTTP 调用以一次删除一堆供应商产品。我可以将 body 传递给删除,以便它包含我们要删除的所有 ID 的列表:

DELETE /api/supplier/6/products
Body:
{
  "DeleteIds": "[5,7,8,10]"
}

在我们将其置于我们的生产代理防火墙后面之前,它运行良好,从 DELETE 请求中删除了 body。

我看过 HTTP 规范 RFC 2616 Fielding, et al.,它没有明确说明我不应该在 DELETE 请求中使用 body,进一步阅读表明没有发送带有 DELETE 请求的 body 有什么问题。

我可以控制我们的代理服务器,并且能够允许 body 通过所有请求,但我担心这可能不是最佳做法。我们可能有数以千计的 Id 需要传递,但我不想使用 headers 或 URL 参数,因为我们可以 运行 来对抗长度限制。

所以我的问题是: 使用请求 的 body 删除多个产品 的正确方法是什么?不仅仅是一种意见,还有关于为什么我不应该使用 HTTP DELETE 的 body 的实际记录证据吗?

我应该继续

DELETE /api/supplier/6/products (Using a body)

或者不应该将 DELETE 与 body 一起使用,而是对

之类的东西执行 POST
POST /api/supplier/6/products/deletemultiple

编辑: 这个问题有一些很好的辩论:Restful way for deleting a bunch of items 它没有解决我关于使用自定义删除操作的 DELETE 请求的 body 的问题,但是对于批量删除可以发生的不同方式有一些很好的争论。

首先,您应该将您的 ID 放入您的请求 URL 中,这样才能正常工作。

其次,在客户端批处理您的请求(将其拆分为固定 ID 计数的块)。 URL 的最大长度限制为 2000,因此,我建议将您的批次 ID 计数限制为 100 或类似值。通过这种方式,您可以获得最高性能和最低网络负载。

好吧,如果您想解决这个问题而不是使用 REST 的概念和非常常见的批处理技术,只需使用 POST 并且不要为批处理而烦恼。实际上,它有一定的意义,因为 HTML 甚至不支持 DELETE =/ 它只是用一些框架伪造的(Ruby on Rails,Javascript,AJAX, 等等)

我都做了,当我想将几个项目传递给删除操作时,我使用 POST 并且只有一个 int[] 作为参数,但我确保URL 我的调用非常明确,因为我使用的是配置而不是约定:即:

/api/products/DeleteAllById

如果我要删除单个项目,那么我将使用 DELETE