REST 中的海量资源删除

问题描述 投票:0回答:1

我正忙于创建一个 REST API,您可以在其中加载公司详细信息,然后加载每个公司的产品,每个公司都有自己的 enpoints

POST /company-details
POST /products

公司详细信息在请求正文中的详细信息如下

companyName
uniqueCode
description
contact
location

产品在请求正文中包含信息

uniqueCpyCode
productName
skuNo

每个人都会在 MySQL 数据库中创建一条带有自动生成 ID 的记录。每个表格都有公司详细信息和产品。然后我还有一个删除端点来删除产品(我也有一个用于公司的端点)

DELETE /products/{id}

我遇到的问题之一是,我希望用户删除公司的所有产品,但想知道在我的用例中批量删除的最佳实践是什么。

我正在考虑有一个端点

DELETE /products/{uniqueCpyCode}

即删除 cpyCode = 请求 id 的产品。但我想知道的是,批量删除此类资源的最佳实践还是我需要一个端点来传递所有 id,尽管产品数量可能接近 1000 个产品。

或者只拥有一个删除端点并让用户多次调用它是否更好。

那么我还有一个问题,如果你想删除整个公司怎么办?一般来说,更好的方法是什么? 1) 调用两个删除端点。

DELETE /products
DELETE /company
  1. 用户仅调用

    删除/公司

内部也调用 DELETE /products enpoint。

api rest
1个回答
0
投票

REST 中的一个重要点是我们有一个统一的接口;该约束中包含的想法是,无论将哪个资源指定为目标,消息的“含义”都是相同的。 换句话说,就像

DELETE /products/1

要求服务器删除

/products/1
与其当前功能之间的关联一样,
DELETE /someResourceForBulkDeletes
表示要求服务器删除
/someResourceForBulkDeletes
与其当前功能之间的关联。
这里出现的是阻抗不匹配:您尝试使用的消息意味着一件事,但实现却做了一些非常不同的事情。

这不一定是错误的事情,但如果它确实引起了问题,律师很容易将财产损失归咎于您的实施(参见

Fielding,20020

)。 HTTP 不支持具有多个目标 URI 的请求;实际上,这意味着通用组件不会从请求中理解涉及多个资源。 (例如,Web 缓存将能够将其缓存失效策略应用于目标资源,但通常不能应用于受实施影响的所有资源。)

简而言之,HTTP 没有一个标准化的消息来表示您想要的内容。

通常,当您想要与标准化含义不匹配的消息语义时,

要使用的正确 HTTP 方法是 POST

。这并不一定会使任何问题变得更好,除了它避免了通用组件根据具有更严格约束语义的方法进行假设而产生的问题之外。 这里的部分问题可能是您混淆了域语义(我们与该公司的合同已过期,因此我们将删除我们的支持)与管理域文档语义(HTTP)。请参阅

Webber 2011

您的域语义碰巧具有导致服务器资源无法访问的

副作用

这一事实并不意味着您应该对相应的请求使用 DELETE。

允许使用 DELETE 方法的资源相对较少——它的主要用途是远程创作环境,用户对其效果有一定的指导。 --
RFC 9110

也就是说,作为源服务器,您可以控制自己的资源空间。如果你想“删除”你的资源,那么你可以——可能很难与其他系统传达你已经这样做了,但在某种程度上这无论如何都会成为一个问题(帕特的浏览器不会自动知道Alex 的浏览器发送了一条消息,触发了级联删除,无论来自 Alex 的消息采用什么形式)。

© www.soinside.com 2019 - 2024. All rights reserved.