多个删除的REST架构?

时间:2011-09-22 07:35:24

标签: java spring rest http-delete

我向服务器发送删除请求,如:

@RequestMapping(value = "/user/{userId}", method = RequestMethod.DELETE)

单个用户删除。但是,当多个用户想要删除时该怎么办?我想遵守REST架构,但我想看到发送多个删除请求的另一种方法吗?

PS:这是一种合适的方式:

@RequestMapping(value = "/user", method = RequestMethod.DELETE, headers = "Accept=application/json")
    public void deleteUser(HttpServletResponse response, @RequestBody String users) throws IOException {
        ...
}

4 个答案:

答案 0 :(得分:6)

因为休息是面向资源的。

尝试设计一个代表“多用户”资源的更高级域名对象,

删除该对象。

也许

@RequestMapping(value = "/users/expired", method = RequestMethod.Delete)

由Subbu Allamaraju撰写的伟大的书“宁静的网络服务菜谱”,请讨论这个主题:

  • 第11.10章,如何批处理类似资源;
  • 第11.11章,如何触发批量操作;
  • 第11.12章,何时使用post合并多个请求;
  • 第11.13章,如何支持批量请求

答案 1 :(得分:2)

我对REST非常熟悉,认识到使用POST来实现DELETE是对REST合规性的偏离。我无法理解这是一个很好的规则的确切原因。

我怀疑它可能与API不可知工具的可行性有关(例如,开发工具根据动词定义的假设做出关于实现状态的假设,而无需配置来理解什么特定的API方法确实或者在部分成功删除的情况下无法返回细粒度错误,但这些只是猜测而不是这个问题的核心。

Swanliu的回答是指使用表示分组构造的URL作为删除的目标,但给出的示例“/ users / expired”表示固定(可能是系统定义的)分组。任意集合中面向用户的情况越多,在某些时候仍需要枚举才能实现。

为大小为N的组发出N DELETE并不具吸引力,因为复合延迟和缺乏原子性,但REST DELETE可能只针对单个资源。

我认为Swanliu的回应所暗示的最佳实践可能是定义一个能够创建资源的POST操作,该资源成为要删除的对象的新包含父级。 POST可以返回正文,因此相关系统可以为此非域分组资源创建制造商的唯一标识符,并将其返回给客户端,客户端可以转向并发出第二个删除它的请求。 POST创建的资源是短暂的,但是有目的性 - 它会逐渐消亡到域对象,这些域对象是批量删除操作的理想目标。

> POST /users/bulktarget/create
> uid=3474&uid=8424&uid=2715&uid=1842&uid=90210&uid=227&uid=66&uid=54&uid=8
> ...
< ...
< 200 OK
< ae8f2b00e

> DELETE /users/bulktarget/ae8f2b00e
> ...
< ...
< 200 OK

当然,两个网络交换不仅仅是一个,但考虑到较小的批量删除是两个对象,并且无论如何都需要两个DELETE操作才能解决,这似乎是一个公平的权衡 - 想象它就像你一样让所有对象超越第二个对象免费。

答案 2 :(得分:1)

我对REST的理解正是您必须做的。如果有替代方案我也很想知道:)

如果您不想发送多个删除请求,则必须设计更粗略的api。 (这就是为什么大多数API都是RESTful而不是REST)

是的,我认为你需要RequestMethod.DELETE?

答案 3 :(得分:0)

AFAIK基本REST用于处理单个资源。我会使用POST /user/资源和一个包含要删除的ID的特殊deleteUsers正文。