【问题标题】:what is the correct way to pass additional parameter to HTTP @DELETE method将附加参数传递给 HTTP @DELETE 方法的正确方法是什么
【发布时间】:2019-03-06 07:56:10
【问题描述】:

我必须构建 JAX-RS Web 服务,它将从客户端资源中删除客户端,另外它应该在请求中有外部 uuid。

没有externalId的@DELETE方法的实现很简单

/myService/client/1


@DELETE
    @Path("/client/{client}")
    public Response removeClient(@PathParam("client") long client) {

        // implementation code 

        return Response.status(200).build();
    }

但是我应该在哪里添加 externalId 作为@QueryParam

如果@QueryParam URI 是这个,它的设计是否正确?

/myService/client/1?externalId=d852e3fc-b7ac-42d7-b22b-74cb4da709ec

  @DELETE
        @Path("/client/{client}")
        public Response removeClient(@PathParam("client") long client, @QueryParam("externalId") String externalId ) {

            // implementation code 

            return Response.status(200).build();
        }

或者我应该将 externalId 发送到request body@PatchParam

哪个是正确的设计?

对于这种情况,我应该使用其他 HTTP 方法而不是 HTTP DELETE 吗?

【问题讨论】:

  • PathParam 是一个好方法。你有什么问题?

标签: java http jax-rs http-method


【解决方案1】:

发送两个信息来识别要删除的资源是不常规的。
这并不意味着它是被禁止的,但你应该意识到它。

在正文中添加此信息?
服务器可能会忽略删除请求的正文。

在路径中添加此信息的后缀 ?
它打破了路径的语义,这应该是一种在层次结构/资源结构中自然识别资源的方式。

我认为,如果您对传达这两个信息有限制并且真的无法更改它,那么您使用 @QueryParam 的实际方式是一种可接受的解决方法。
作为替代方案,您还可以使用 URL 矩阵参数来传达复合 ID
例如DELETE /myService/client/1,123456,其中 1 是客户端 ID,123456 是 uuid

【讨论】:

    【解决方案2】:

    来自specification:

    DELETE 方法请求源服务器删除由 Request-URI 标识的资源。此方法可能会被源服务器上的人工干预(或其他方式)覆盖。即使从源服务器返回的状态码表明操作已经成功完成,客户端也不能保证操作已经执行。但是,服务器不应指示成功,除非在给出响应时它打算删除资源或将其移动到无法访问的位置。

    如果响应包含描述状态的实体,则成功的响应应该是 200(OK),如果尚未执行该操作,则应为 202(已接受),或者如果该操作已执行但响应为 204(无内容)不包括实体。

    如果请求通过缓存并且 Request-URI 标识了一个或多个当前缓存的实体,则这些条目应该被视为陈旧的。对此方法的响应不可缓存。

    因此,对参数传递没有任何限制或建议。你可以使用任何你喜欢和方便的变体

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-20
      • 2016-06-07
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      相关资源
      最近更新 更多