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
查询参数包含了item1
和item2
的值。
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上找到。