我必须构建JAX-RS Web服务,该服务将从客户端资源中删除客户端,并且在请求中应具有外部uuid。
没有外部ID的@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吗?
答案 0 :(得分:1)
发送两个信息以标识要删除的资源不是常规做法。
这并不意味着它被禁止,但是您应该意识到这一点。
将此信息添加到正文中吗?
服务器可能会忽略正文的删除请求。
此信息在路径后缀吗?
它破坏了路径的语义,该路径本来是一种自然地标识层次结构/资源结构中的资源的方法。
我认为,如果您在传达这两项信息方面受到限制,并且确实您不能更改它,那么使用@QueryParam
的实际方法是可以接受的解决方法。
或者,您也可以使用URL矩阵参数来传达复合ID
例如DELETE /myService/client/1,123456
,其中1是客户ID,而123456是uuid
答案 1 :(得分:1)
DELETE方法请求源服务器删除由Request-URI标识的资源。在原始服务器上,人为干预(或其他方式)可能会覆盖此方法。即使从原始服务器返回的状态代码指示该操作已成功完成,也不能保证客户机已执行了该操作。但是,服务器不应指示成功,除非在给出响应时服务器打算删除资源或将其移动到无法访问的位置。
如果响应包含描述状态的实体,则成功响应应该为200(确定);如果尚未执行该操作,则为202(接受);如果已执行但响应为响应,则返回204(无内容)。不包含实体。
如果请求通过缓存,并且Request-URI标识一个或多个当前缓存的实体,则应将这些条目视为过期。此方法的响应不可缓存。
因此,对参数传递没有任何限制或建议。您可以随意使用任何变体