使用REST进行HTTP删除

12
我目前正在使用Jersey框架(JAX-RS实现)构建RESTful Web服务。 项目中的资源类已经实现了标准的HTTP操作 - GET,POST和DELETE。 我正在尝试弄清楚如何将请求参数从客户端发送到这些方法。
对于GET请求,可以在查询字符串中传递参数(使用@QueryParam进行提取),而对于POST请求,则是在请求正文中发送名称/值对列表(使用@FormParam进行提取)。 我使用HTTPClient进行了测试,测试通过。 对于DELETE操作,我没有找到关于参数类型/格式的确切答案。 DELETE操作接收查询字符串中的参数(使用@QueryParam进行提取)还是正文中的参数(使用@FormParam进行提取)?
在Web上的大多数DELETE示例中,我观察到使用@PathParam注释进行参数提取(这又是来自查询字符串的)。 这是传递参数给DELETE方法的正确方式吗? 我只想小心处理,以免违反任何REST原则。
4个回答

22

是的,这取决于您,但按照我理解REST的思想,DELETE URL应该删除由GET URL请求返回的内容。例如,如果

GET http://server/app/item/45678

返回 id 为 45678 的项目。

DELETE http://server/app/item/45678

应该删除它。

因此,我认为在QueryParam可以用于控制某些工作方面时,使用PathParam比QueryParam更好。

DELETE http://server/app/item/45678?wipeData=true

3
“?wipeData=true” 是查询字符串的误用。RFC 3986第3.4节指出:“查询组件包含非分层数据,以及路径组件(第3.3节)中的数据,用于在URI方案和命名机构(如果有)的范围内标识资源”。稍微令人困惑的是RFC 7231第4.2.1节提到:“例如,基于Web的内容编辑软件通常使用查询参数中的操作,比如‘page?do=delete’”。我认为这也是不正确的。 - aaaaaa

15

DELETE方法应该使用URL来标识要删除的资源。这意味着您可以使用路径参数或查询参数。除此之外,在REST方面构建URL的方式没有对错之分。


3
您可以像这样使用:
URL是 http://yourapp/person/personid
@DELETE
@Path("/person/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response deletePerson(@PathParam("id") String id){
    Result result = new Result();
    try{
        persenService.deletePerson(id);
        result.setResponce("success"); 
    }
    catch (Exception e){
        result.setResponce("fail");
        e.printStackTrace();
    }
    return Response.status(200).entity(result).build();
}

0

@QueryParam 是正确的方式。@PathParam 仅适用于任何 url 参数之前的内容('?' 后面的内容)。@FormParam 仅适用于具有表单内容类型的提交的 Web 表单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接