【发布时间】:2019-08-26 03:50:43
【问题描述】:
我需要在批处理中按 id 删除多个项目,但是 HTTP DELETE 不支持正文负载。
解决选项:
1. @DELETE /path/abc?itemId=1&itemId=2&itemId=3 on the server side it will be parsed as List of ids and DELETE operation will be performed on each item.
2. @POST /path/abc including JSON payload containing all ids. { ids: [1, 2, 3] }
这有多糟糕,哪个选项更可取?有什么选择吗?
更新:请注意,性能是这里的关键,它不是对每个单独的 id 执行删除操作的选项。
【问题讨论】:
-
两者都是不可取的,因为批处理中的部分批处理失败的http方法在返回结果http状态代码时会出现问题。另一种方法是让客户负责批处理操作。
-
@Mr.Wrong 客户如何负责批处理?批处理的全部意义在于优化一个流程,而不是一个一个地执行请求。
-
除了错误先生所说的之外,您的两个建议将防止(n 个中间)缓存使调用的 URI 的任何存储响应表示无效,这基本上是一个缓存键,包括任何路径、矩阵或查询参数。因此,对
GET /path/abc?itemId=1的请求可能仍然由缓存提供服务,而不是由实际服务器提供服务,即使实际资源可能已经通过批处理删除。 -
@RomanVottner 不确定,这与进行任何其他 MUTATION 操作相同。如果您将多个项目添加到类别“A”缓存中,则必须刷新类别“A”。与删除相同。如果您遵循您的逻辑,则意味着您根本无法使用 REST 进行批量操作。
-
@WildGoat @WildGoat RFC 7234 谈到如果执行变异操作会使任何缓存信息无效,但缓存使用effective request URI 来确定目标资源。通常通过
POST /path/to/collections向集合中添加新项目,而通过GET path/to/collections/item检索特定项目,这是与用于存储新项目的键不同的键。更新或删除该特定项目将使缓存无效,但 OOTB。
标签: rest http-delete