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

Sha*_*unP 5 c# http http-delete asp.net-web-api asp.net-web-api2

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

我们的 UI 将允许用户选择各种过滤条件,并使用它一次删除大量产品。

问题是执行几千个单独的 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
...
Run Code Online (Sandbox Code Playgroud)

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

DELETE /api/supplier/6/products
Body:
{
  "DeleteIds": "[5,7,8,10]"
}
Run Code Online (Sandbox Code Playgroud)

这很有效,直到我们把它放在我们的生产代理防火墙后面,它从 DELETE 请求中剥离了主体。

我看过 HTTP Spec RFC 2616 Fielding 等。并且它没有明确说明我不应该在 DELETE 请求中使用正文,进一步阅读表明发送带有 DELETE 请求的正文没有任何问题。

我可以控制我们的代理服务器,并且能够允许所有请求都通过正文,但我担心这可能不是最佳做法。我们可能有数千个要通过的 Id,我不希望我们使用标头或 URL 参数,因为我们可能会遇到长度限制。

所以我的问题是:使用请求正文 对多个产品进行删除的正确方法什么?不仅仅是一个意见,而且是否有实际记录的证据来说明为什么我不应该使用 HTTP DELETE 的正文?

我应该继续

DELETE /api/supplier/6/products (Using a body)
Run Code Online (Sandbox Code Playgroud)

或者不应该将 DELETE 与正文一起使用,而是对类似的内容进行 POST

POST /api/supplier/6/products/deletemultiple
Run Code Online (Sandbox Code Playgroud)

编辑:在这个问题中有一些很好的辩论:删除一堆项目的宁静方式 它没有解决我关于使用 DELETE 请求的正文进行自定义删除操作的问题,但是有一些关于不同方式的很好的辩论可能会发生批量删除。

Mar*_* C. 1

我已经完成了这两项操作,当我想将多个项目传递给删除操作时,我使用 aPOST并且仅将 anint[]作为参数,但我确保我调用的 URL 非常明确,因为我使用的是配置而不是约定: IE:

/api/products/DeleteAllById

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