发送 id 的常规方式是什么——@PathParam 或@HeaderParam 或@QueryParam?

Which is the conventional way of sending id - @PathParam or @HeaderParam or @QueryParam?

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

当我删除任何用户时,我必须 return 在删除所请求的用户后该帐户的现有用户列表。我不需要 accountId 来删除用户,但我需要它来在删除用户后将用户列表获取到 return。我对哪种注释可以作为最佳实践感到困惑?

//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);
}

如果 URL 类似于 http://localhost:8080/app/index?param=value 使用

QueryParam

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

PathParam

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

您可以在控制器中的请求映射中使用 HttpServletRequest object,并在请求的 header 中传递 accID。在控制器中,使用以下方法获取特定 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, HttpServletRequest httpServletRequest) {
     userService.deleteUser(userId);
     Integer accId = httpServletRequest.getHeader("accId");
     return userService.getUsers(accId);
}

你说的三种情况没有标准出路。这完全取决于需求以及您希望如何公开您的 api 和请求参数。而选择完全取决于这些部分。

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

如果一位用户恰好连接到一个帐户,我会这样定义 URL:

@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);
}

如果同一个用户可能属于不同的帐户,我会将请求分成两个,一个用于删除,另一个用于 return 其余用户:

@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);
}