Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling Multiple Query Parameters in Jersey

In the web service I'm working on, I need to implement a URI with query parameters which look like /stats?store=A&store=B&item=C&item=D

To break it down, I need to be able to use query parameters to specify data from multiple/all stores and data for multiple/all items from those stores. So far I have been able to implement one query argument just fine in order to pull item data, but I'm lost as far as to how to implement more queries, and can't seem to find the resources I had seen before which deal with this implementation.

What I have so far in my method is along the lines of

@GET @Path("stats") public String methodImCalling(@DefaultValue("All") @QueryParam(value = "item") final String item) {     /**Run data using item as variable**/     return someStringOfData } 

which works well for one item, and will return all data if I don't type the parameter in the URI. However, I am unsure how to handle any more parameters than this.

Update:

I have figured out how to use 2 different parameters by simply adding a second argument to the method like so:

public String methodImCalling(@DefaultValue("All") @QueryParam(value = "store") final String store,     @DefaultValue("All") @QueryParam(value = "item") final String item) 

The question remains of how to implement multiple values of the same parameter.

like image 244
ZKSteffel Avatar asked May 27 '11 16:05

ZKSteffel


People also ask

How do you pass multiple query parameters in restful web services?

@PUT @Path("{user}/{directory:. +}") public Response doshare(@PathParam("user")String name, @PathParam("directory")String dir, @QueryParam("name")String sharename, @QueryParam("type")String type){ mongoDAOImpl impl=new mongoDAOImpl(); Mongo mongo=impl. getConnection("127.0. 0.1","27017"); DB db=impl.

Can we use PathParam and QueryParam together?

This is not a standard, you can use anyone for designing restful api. However, the commonly used convention is : Any required or mandatory attributes should be added as path param. Any optional attributes should be added as query param.


2 Answers

If you change the type of your item method parameter from String to a collection such as List<String>, you should get a collection that holds all the values you are looking for.

@GET @Path("/foo") @Produces("text/plain") public String methodImCalling(@DefaultValue("All")                                @QueryParam(value = "item")                                final List<String> item) {    return "values are " + item; } 

The JAX-RS specification (section 3.2) says the following regarding the @QueryParam annotation:

The following types are supported:
  1. Primitive Types
  2. Types that have a constructor that accepts a single String argument.
  3. Types that have a static method named valueOf with a single String argument.
  4. List<T>, Set<T>, or SortedSet<T> where T satisfies 2 or 3 above.
like image 165
stand Avatar answered Sep 18 '22 23:09

stand


List<String> items=ui.getQueryParameters().get("item");

where ui is declared as a member in the rest resource like so :

@Context UriInfo ui; 

the downside is that it doesn't appear in the methods arguments at all.

like image 40
Tal Avatar answered Sep 17 '22 23:09

Tal