我向服务器发送删除请求,如:
@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 {
...
}
答案 0 :(得分:6)
因为休息是面向资源的。
尝试设计一个代表“多用户”资源的更高级域名对象,
删除该对象。
也许
@RequestMapping(value = "/users/expired", method = RequestMethod.Delete)
由Subbu Allamaraju撰写的伟大的书“宁静的网络服务菜谱”,请讨论这个主题:
答案 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
正文。