【问题标题】:Which is the conventional way of sending id - @PathParam or @HeaderParam or @QueryParam?发送 id 的常规方式是 @PathParam 还是 @HeaderParam 还是 @QueryParam?
【发布时间】:2018-07-10 11:49:07
【问题描述】:

我并不是要求这三者之间有区别。我正在开发一个使用 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);
}

【问题讨论】:

  • 不能通过userId获取accountId吗?他们肯定是相关的。

标签: java rest jax-rs


【解决方案1】:

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

如果一个用户只连接到一个帐户,我会这样定义 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);
}

如果同一个用户可能属于不同的帐户,我会将请求分成两份,一份用于 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);
}

【讨论】:

    【解决方案2】:

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

    查询参数

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

    路径参数

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

    【讨论】:

    • 我必须创建 URL。我想知道 3 中的标准方法是什么?
    • 取决于 URL 类型,但首选 QueryParam 和 PathParam
    • @DharitaChokshi 没有“标准”方式,但标题参数会很奇怪。 REST 倾向于路径参数。所有这些都是有效的,这使得这是一个基于意见的问题。使用常识:什么与您的用法和 API 相匹配?您想向消费者展示什么?
    • 当您使用 PathParam 时,您可能拥有具有不同数据类型的相同 URL。 localhost:8080/app/index/int & localhost:8080/app/index/string 如果你非正式地映射,很容易出现一些不必要的错误
    【解决方案3】:

    您可以在控制器的请求映射中使用 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 和请求参数。选择完全取决于这些部分。

    【讨论】:

      猜你喜欢
      • 2019-06-10
      • 2021-07-25
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多