将附加参数传递给HTTP @DELETE方法的正确方法是什么

问题描述 投票:0回答:2

我必须构建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吗?

java http jax-rs http-method
2个回答
1
投票

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

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

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

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


1
投票

来自specification:

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

如果响应包括描述状态的实体,则成功响应应为200(OK),如果操作尚未执行,则应为202(已接受);如果操作已颁布但响应不包括,则应为204(无内容)一个实体。

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

因此,没有任何关于参数传递的限制或推荐。您可以根据自己的喜好使用任何变体,方便

© www.soinside.com 2019 - 2024. All rights reserved.