我必须构建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吗?
发送两个信息以识别要删除的资源并不常见。 这并不意味着它是被禁止的,但你应该意识到它。
在身体中添加这些信息? 服务器可能会忽略删除请求的正文。
在路径中加上这些信息? 它打破了路径的语义,应该是一种在层次结构/资源结构中自然识别资源的方法。
我认为你使用@QueryParam
的实际方法是一个可接受的解决方法,如果你有约束来传达这两个信息,而且你真的无法改变它。
作为替代方案,您还可以使用URL矩阵参数来传达复合ID
例如DELETE /myService/client/1,123456
,其中1是客户端ID,123456是uuid
DELETE方法请求源服务器删除Request-URI标识的资源。可以通过源服务器上的人为干预(或其他方式)覆盖此方法。即使从源服务器返回的状态代码指示操作已成功完成,也无法保证客户端已执行该操作。但是,服务器不应该指示成功,除非在给出响应时,它打算删除资源或将其移动到不可访问的位置。
如果响应包括描述状态的实体,则成功响应应为200(OK),如果操作尚未执行,则应为202(已接受);如果操作已颁布但响应不包括,则应为204(无内容)一个实体。
如果请求通过缓存并且Request-URI标识一个或多个当前缓存的实体,则这些条目应该被视为陈旧。对此方法的响应不可缓存。
因此,没有任何关于参数传递的限制或推荐。您可以根据自己的喜好使用任何变体,方便