哪种常规发送ID的方式-@PathParam或@HeaderParam或@QueryParam?

时间:2018-07-10 11:49:07

标签: java rest jax-rs

我并不是要要求这三者之间有区别。我正在使用JAX-RS构建的应用程序。它使用Hibernate与数据存储进行交互。每个用户都与一个特定帐户相关联。

虽然我要删除任何用户,但是删除请求的用户后,我必须返回该帐户现有的用户列表。我不需要accountId来删除用户,但是我需要它来获取删除用户后返回的用户列表。我对哪种注释将是最佳做法感到困惑?

//Sending accountId in path variable
@DELETE
@Consumes(MediaType.APPLICATION_JSON)
@Path("/user/{accId}/{userId}")
public List<Users> deleteUser(@HeaderParam("token") String token, @PathParam("accId") Integer accId, @PathParam("userId") Integer userId) {
     userService.deleteUser(userId);
     return userService.getUsers(accId);
}

//Sending accountId in header
@DELETE
@Consumes(MediaType.APPLICATION_JSON)
@Path("/user/{userId}")
public List<Users> deleteUser(@HeaderParam("token") String token, @HeaderParam("accId") Integer accId, @PathParam("userId") Integer userId) {
     userService.deleteUser(userId);
     return userService.getUsers(accId);
}

//Sending accountId as query string
@DELETE
@Consumes(MediaType.APPLICATION_JSON)
@Path("/user/{userId}")
public List<Users> deleteUser(@HeaderParam("token") String token, @QueryParam("accId") Integer accId, @PathParam("userId") Integer userId) {
     userService.deleteUser(userId);
     return userService.getUsers(accId);
}

3 个答案:

答案 0 :(得分:1)

我认为这是基于意见的,并且取决于用户和帐户之间的关系。

如果只有一个用户连接到一个帐户,则可以这样定义网址:

@DELETE
@Consumes(MediaType.APPLICATION_JSON)
@Path("/account/{accId}/user/{userId}")
public List<Users> deleteUser(@HeaderParam("token") String token, @PathParam("accId") 
        Integer accId, @PathParam("userId") Integer userId) {
    userService.deleteUser(userId);
    return userService.getUsers(accId);
}

如果同一用户可能属于不同的帐户,我会将请求分为两部分,一个用于DELETE,另一个用于返回其余用户:

@DELETE
@Consumes(MediaType.APPLICATION_JSON)
@Path("/user/{userId}")
public void deleteUser(@HeaderParam("token") String token, @PathParam("userId") Integer userId) {
    userService.deleteUser(userId);
}

@GET
@Consumes(MediaType.APPLICATION_JSON)
@Path("/user")
public List<Users> getUsers(@HeaderParam("token") String token, @QueryParam("accId") Integer accId) {
    return userService.getUsers(accId);
}

答案 1 :(得分:0)

如果网址类似于http://localhost:8080/app/index?param=value,请使用

  

QueryParam

如果网址类似于http://localhost:8080/app/index/value

  

PathParam

HeaderParam通常用于获取元数据或标头数据。

答案 2 :(得分:0)

您可以在控制器中的请求映射中使用HttpServletRequest对象,并在请求的标头中传递accID。然后在控制器中,使用以下命令获取特定标头的值:

@DELETE
@Consumes(MediaType.APPLICATION_JSON)
@Path("/user/{userId}")
public List<Users> deleteUser(@HeaderParam("token") String token, @HeaderParam("accId") Integer accId, @PathParam("userId") Integer userId, HttpServletRequest httpServletRequest) {
     userService.deleteUser(userId);
     Integer accId = httpServletRequest.getHeader("accId");
     return userService.getUsers(accId);
}

您提到的三种情况中没有标准方法。这完全取决于需求以及您要如何公开api和请求参数。而且选择完全取决于这些部分。