Java 用于多次删除的REST体系结构?

Java 用于多次删除的REST体系结构?,java,spring,rest,http-delete,Java,Spring,Rest,Http Delete,我向服务器发送删除请求,如下所示: @RequestMapping(value = "/user/{userId}", method = RequestMethod.DELETE) 对于单个用户,请删除。但是,当多个用户想要删除时,该怎么办?我想遵守REST体系结构,但我想看看发送多个删除请求的其他方法 PS:这是一种合适的方式: @RequestMapping(value = "/user", method = RequestMethod.DELETE, headers = "Accept=

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

@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 {
        ...
}

我对休息的理解是,这正是你必须做的。如果还有其他选择,我也想知道:)

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


顺便说一句,我认为您需要RequestMethod.DELETE?

,因为rest是面向资源的

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

不要删除那个对象

也许吧

俄勒冈州Subbu Allamaraju的名著《restful web服务食谱》,讲述了以下主题:

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

AFAIK基本的休息是使用单个资源。我将使用一个
POST
/user/
资源和一个特殊的
deleteUsers
主体,其中包含要删除的ID。

我对REST非常熟悉,认识到使用POST实现删除是对REST合规性的背离。我不知道确切的原因,这是个好规则

我怀疑这可能与API不可知工具的可行性有关(例如,开发工具基于动词定义的givens对实现状态进行假设,而无需配置以了解特定API方法的功能)或者在部分成功删除的情况下无法返回细粒度错误,但这些只是猜测,并不是这个问题的核心

Swanliu的答案是使用表示分组结构的URL作为删除目标,但给出的示例“/users/expired”建议使用固定(可能是系统定义的)分组。对于更面向用户的任意集合,仍然需要在某个点进行枚举才能实现

为大小为N的组发出N个DELETEs并不吸引人,这两个原因都是由于复合延迟和原子性不足,但是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
>POST/users/bulktarget/create
>uid=3474&uid=8424&uid=2715&uid=1842&uid=90210&uid=227&uid=66&uid=54&uid=8
> ...
< ...
<200 OK
删除/users/bulktarget/ae8f2b00e
> ...
< ...
<200 OK

诚然,两个网络交换不如一个网络交换那么理想,但考虑到较小的批量删除是两个对象,并且需要两个删除操作来寻址而无需任何方式,这似乎是一个公平的权衡——想想看,除了第二个对象之外,你可以免费获得所有对象。

你的意思是
RequestMethod.DELETE
?@kamaci:DELETE通常没有主体,所以你不能随它一起发送用户ID。DELETE通常删除整个资源(以及所有子资源)。我写了一个答案,它使用POST而不是DELETE,但与编辑类似。它不必是域对象,只是表示对象集的附加资源。是的,这是最好的选择。另一个可能是HTTP管道,但还没有得到足够广泛的实现。附言:为你自己做某事,并实际接受答案:-)你建议把用户送到一个机构吗?是的。但是uri、正文格式和响应代码应该仔细设计。因此,如果可能的话,在开始编码之前,请阅读俄勒冈州Sbbu Allamaraju的《restful web服务食谱》:p11.12,何时使用post合并多个请求;和p11.13,如何支持批处理请求
> 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