1. 概述

Jersey 是一个用于开发RESTful Web服务的开源框架。它作为JAX-RS规范的一个参考实现。

在这个教程中,我们将探讨使用Jersey客户端时如何以不同的方式将列表作为查询参数添加到请求中。

2. 接收查询参数的GET API

首先,我们将创建一个GET API,它接收查询参数

我们可以使用@QueryParam注解从URI(/cs/uniform-resource-identifiers)中的查询参数中提取值。 @QueryParam注解接受一个单一参数,即我们想要提取的查询参数的名称。

为了使用@QueryParam指定列表类型的查询参数,我们需要将注解应用到方法参数上,表明它会从URL中的查询参数接收一个值列表:

@Path("/")
public class JerseyListDemo {
    @GET
    public String getItems(@QueryParam("items") List<String> items) {
        return "Received items: " + items;
    }
}

接下来,我们将使用不同的方法传递列表作为查询参数。完成后,我们将验证响应以确保资源正确处理项目列表。

3. 使用queryParam()

Jersey中的queryParam()方法在构建HTTP请求时向URL添加查询参数。**queryParam()方法允许我们指定查询参数的名称和值。**

3.1. 直接使用查询参数

在这个方法中,我们直接使用Jersey提供的方法添加查询参数。

在下面的例子中,我们有一个WebTarget对象target(),我们将查询参数items的多个值item1,item2添加到请求URL中:

@Test
public void givenList_whenUsingQueryParam_thenPassParamsAsList() {
    Response response = target("/")
      .queryParam("items", "item1", "item2")
      .request
      .get();
    assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
    assertEquals("Received items: [item1, item2]", response.readEntity(String.class));
}

这将导致包含查询参数/?items=item1&items=item2的URL。在这种情况下,items查询参数包含了item1item2的值。

3.2. 使用逗号分隔的字符串

在这个方法中,我们将一个列表转换为逗号分隔的字符串,然后作为查询参数添加到Jersey客户端中。这简化了URL构造过程,但需要服务器端逻辑来解析字符串为列表:

@Test
public void givenList_whenUsingCommaSeparatedString_thenPassParamsAsList() {
    Response response = target("/")
      .queryParam("items", "item1,item2")
      .request()
      .get();
    assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
    assertEquals("Received items: [item1,item2]", response.readEntity(String.class));
}

这将导致包含查询参数/?items=item1,item2的URL。这里的items查询参数包含了item1,item2的值。

4. 使用UriBuilder

UriBuilder方法是构建带有查询参数的URL的一种强大方式。在这个方法中,我们创建一个UriBuilder实例,指定基URI,并迭代添加查询参数:

@Test
public void givenList_whenUsingUriBuilder_thenPassParamsAsList() {
    List<String> itemsList = Arrays.asList("item1","item2");
    UriBuilder builder = UriBuilder.fromUri("/");
    for (String item : itemsList) {
        builder.queryParam("items", item);
    }
    URI uri = builder.build();
    String expectedUri = "/?items=item1&items=item2";
    assertEquals(expectedUri, uri.toString());
}

单元测试(/junit)确保UriBuilder正确组装了带有所需查询参数的URL,并验证其准确性。

5. 总结

在这篇文章中,我们学习了在Jersey中以不同方式将列表作为查询参数传递的方法。

对于简单的用例,queryParam()方法非常直观,是不错的选择。而对于动态URL生成和多个查询参数的情况,UriBuilder更为合适。选择取决于应用程序的需求,考虑的因素包括列表的复杂性和动态URL构建的必要性。

如往常一样,本文档中展示的所有代码可以在GitHub上找到。