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

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


万一@QueryParamURI是这样的,它是正确的设计吗?


/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 吗?


幕布斯7119047
浏览 161回答 2
2回答

智慧大石

发送两个信息来识别要删除的资源是不常规的。这并不意味着它是被禁止的,但你应该意识到它。在正文中添加此信息?服务器可能会忽略删除请求的正文。在路径中添加此信息的后缀?它打破了路径的语义,这应该是一种在层次结构/资源结构中自然识别资源的方式。我认为,@QueryParam如果您有传达这两个信息的限制并且您确实无法更改它,那么您的实际方式是一种可以接受的解决方法。作为替代方案,您还可以使用 URL 矩阵参数来传达复合 ID,例如 DELETE /myService/client/1,123456其中 1 是客户端 ID,123456 是 uuid

梵蒂冈之花

从规范:DELETE 方法请求源服务器删除由 Request-URI 标识的资源。此方法可能会被源服务器上的人工干预(或其他方式)覆盖。即使从源服务器返回的状态码表明操作已经成功完成,客户端也不能保证操作已经执行。但是,服务器不应指示成功,除非在给出响应时它打算删除资源或将其移动到无法访问的位置。如果响应包含描述状态的实体,则成功的响应应该是 200(OK),如果操作尚未制定,则为 202(已接受),或者如果操作已经制定但响应不包括,则应为 204(无内容)一个实体。如果请求通过缓存并且 Request-URI 标识了一个或多个当前缓存的实体,那么这些条目应该被视为陈旧的。对此方法的响应不可缓存。因此,对参数传递没有任何限制或建议。您可以根据需要使用任何变体,方便您使用
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java