java - 使用不同的 QueryParams 重载 REST 端点

标签 java rest jersey jax-rs

我正在尝试确定与变量为 Collection<String> 的 Jersey 客户端端点交互的最佳方式.我不是 100% 确定这样做是正确的,但我想知道这是否可能/实现此目标的正确方法是什么 - 也许是 @POST有消息正文?

DAO中的方法是Set<Foo> retrieveByKeys(Collection<String> keys) .因此,我试图找出为此创建端点的最佳方法。第一个想法是:

@POST
@Path('/foos')
@Consumes(MediaType.APPLICATAION_JSON)
@Produces(MediaType.APPLICATAION_JSON)
Response retrieveByKeys(Collection<String> keys) {
    ... //do things
}

或者:

@GET
@Path('/foos')
Response retrieveByKeys(@QueryParam('keys') Collection<String> keys) {
    ... //do things
}

我不太确定你可以做第二个,但有人建议将其作为一种可能的解决方案。

这两种方式都很好,但同时我的 DAO 中还有另一种方法那是 List<Foo> retrievePageStartingFrom(String startKey, int pageSize) .我知道最好的休息做法是尽可能重复使用 url,这就是我试图对这两个做的事情。我只是在努力寻找一种方法来区分这两种方法但保持相同的 url。

我想知道是否可以用其他 @QueryParams 使端点过载但这次像:

@GET
@Path('/foos')
Response retrievePageStartingFrom(@QueryParam('startKey') String startKey, @QueryParam('pageSize') int pageSize) {
    ... //do things
}

而且 Jersey Client 会知道区分这两个调用,因为第一个方法有一个参数,第二个方法有两个参数,这两个参数也是不同的类型。

我想我想我正在尝试做的最好的方式就像在 java 中一样,当您可以拥有一个具有特定参数的构造函数,以及另一个具有不同/不同类型参数但具有相同方法名称(显然)的构造函数时。

无论正确答案是什么,如果可能,我都会尝试为这两种方法保留相同的 URL,我想知道实现该目标的最佳方法是什么!谢谢。

最佳答案

不,如果所有端点方法都使用相同的 HTTP 方法(例如,都使用 @Get Annotation)但查询参数不同,则不可能重载端点方法。 Rest 资源由 URI 而非参数唯一标识。

您需要做的是检查是否存在不同的查询参数并调用所需的实现:

@GET
@Path('/foos')
Response retrieveByKeys(@QueryParam('keys') Collection<String> keys, @QueryParam('startKey') String startKey, @QueryParam('pageSize') int pageSize) {
    List<FooRes> fooResources;
 //check if keys Collection is empty
 if(keys==null||keys.isEmpty()){
    if(startKey==null || startKey.isEmpty()){
      return Response.status(Status.BAD_REQUEST).build();
    }else{
       if(pageSize==null||pageSize.isEmpty()){
          //set default pageSize
          pageSize=10;

          //call your DAO or Repository or Service methods
        fooResources=foosRepo.partialResults(startKey,pageSize);
         ....

        }
   }else{
     fooResources=foosRepo.findByKeys(keys);
   }
 }

 return Response.ok().entity(fooResources).build();
}

这是一个原始的想法,你可以让你的想法更清楚,而不是使用 if..else.. 的嵌套网络

关于java - 使用不同的 QueryParams 重载 REST 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38774494/

相关文章:

java - 删除端点 url 中的 v1

java - 将 spring 从 3.1.1 升级到 4.3.3 后出现 Spring UnsatisfiedDependencyException

java - 使用动态 id 为 jQuery 中的隐藏字段赋值?

java - 从 Java 中的前序数组重建二叉搜索树的递归实现?

java - Hadoop 从映射器写入新文件

java - 如何通过 REST 传输 ArrayList<Map>?

java - Spring Boot 应用程序 Post 方法调用,405 : Method Not Allowed

java - 为 Web 和服务端点建立单独的项目/部署是一种好的做法吗?

java - Jersey 休息服务器 - 返回列表作为 json

java - jackson 2.1.3 的 web.xml