【问题标题】:http delete with REST使用 REST 删除 http
【发布时间】:2016-02-10 14:42:01
【问题描述】:

我目前正在使用 Jersey 框架(JAX-RS 实现)来构建 RESTful Web 服务。项目中的资源类已经实现了标准的 HTTP 操作——GET、POST 和 DELETE。我试图弄清楚如何将请求参数从客户端发送到这些方法。

对于 GET,它将位于查询字符串中(使用 @QueryParam 提取),POST 将是与请求正文一起发送的名称/值对列表(使用 @FormParam 提取)。我使用 HTTPClient 对它们进行了测试并且工作正常。对于 DELETE 操作,我没有找到关于参数类型/格式的任何结论性答案。 DELETE 操作是否在查询字符串(使用@QueryParam 提取)或正文(使用@FormParam 提取)中接收参数?

在网络上的大多数 DELETE 示例中,我观察到使用 @PathParam 注释进行参数提取(这将再次来自查询字符串)。

这是将参数传递给 DELETE 方法的正确方法吗?我只是想在这里小心一点,以免违反任何 REST 原则。

【问题讨论】:

    标签: rest jersey


    【解决方案1】:

    是的,这取决于您,但是当我了解 REST 意识形态时,DELETE URL 应该删除 GET URL 请求返​​回的内容。例如,如果

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

    返回 id 为 45678 的项目,

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

    应该删除它。

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

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

    【讨论】:

    • '?wipeData=true' 是对查询字符串的误用。 rfc 3986 第 3.4 节指出“查询组件包含非分层数据,这些数据与路径组件(第 3.3 节)中的数据一起用于标识 URI 方案和命名权限(如果有)范围内的资源。”稍微令人困惑的是 rfc 7231 第 4.2.1 节提到“例如,基于 Web 的内容编辑软件通常在查询参数中使用操作,例如“page?do=delete””,我想说这也是不正确的。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以这样使用

      网址是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();
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-08-31
          • 2019-05-26
          • 2017-04-09
          • 2021-09-22
          • 1970-01-01
          • 1970-01-01
          • 2015-01-27
          • 1970-01-01
          • 2011-10-12
          相关资源
          最近更新 更多