Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

Jersey is an open-source framework for developing RESTful web services. It serves as a reference implementation of JAX-RS.

In this tutorial, we’ll explore different ways to add a list as a query parameter when making requests using the Jersey client.

2. GET API to Receive a List in Query Parameters

We’ll first create a GET API, which receives a list in query parameters.

We can use the @QueryParam annotation to extract values from query parameters in a URI. The @QueryParam annotation takes a single argument, which is the name of the query parameter we want to extract.

To specify a list-type query parameter using @QueryParam, we apply the annotation to a method parameter, indicating that it receives a list of values from a query parameter in the URL:

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

Now, we’ll use different methods to pass the list as a query parameter. Once done, we’ll verify the response to ensure the resource processes the list of items correctly.

3. Using queryParam()

The queryParam() method in Jersey adds query parameters to a URL when constructing an HTTP request. The queryParam() method allows us to specify the name and value of a query parameter.

3.1. Using Query Parameters Directly

In this approach, we add the query parameters directly using the method provided by Jersey.

In the below example, we’ve got a WebTarget as target(), and we’re adding a query parameter items with multiple values item1,item2 to the request 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));
}

This results in a URL with query parameters like /?items=item1&items=item2. Here, the items query parameter contains both item1 and item2 as its values.

3.2. Using a Comma-Separated String

In this approach, we convert a list into a comma-separated string, which is then added as a query parameter in the Jersey client. It simplifies the URL construction process but requires server-side logic to parse the string into a list:

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

This results in a URL with query parameters like /?items=item1,item2. Here, the items query parameter contains item1,item2 as its values.

4. Using UriBuilder

The UriBuilder approach is a powerful way to construct URLs with query parameters. In this approach, we create a UriBuilder instance, specify the base URI, and add query parameters iteratively:

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

The unit test ensures that the UriBuilder correctly assembles the URL with the desired query parameters and also validates its accuracy.

5. Conclusion

In this article, we learned different methods of passing a list as a query parameter in Jersey.

The queryParam() method is straightforward, making it a suitable choice for simple cases. On the other hand, UriBuilder is well-suited for dynamic URL generation with multiple query parameters. The choice depends on the need of the application, taking into factors like list complexity and the necessity of dynamic URL construction.

As always, all the code presented in this article is available over on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.