Define parameters for request representations to resources in RESTful applications
Overview
Use parameters as part of the URL or in the headers. Path parameters, matrix parameters, query parameters, header parameters, and cookie parameters are useful for passing in additional information to a request.
Multiple parameter types exist. JAX-RS enables access using annotated injected parameters.
We can use any basic Java primitive type including java.lang.String as parameters, as well as Java types with a constructor that uses a single String or a valueOf(String) static method. Additionally, we can use List, SortedSet, and Set interfaces where the generic type is one of the previously mentioned types, such as a Set when a parameter can have multiple values. To parse requests, use String as the parameter type to enable basic inspection and customization of error path responses.
Resource method parameter annotations
javax.ws.rs.PathParam Path parameters are part of the URL. For example, the URL can include...
/collection/{item}
...where {item} is a path parameter identifying item in the collection. Because path parameters are part of the URL, they are essential in identifying the request.
If parts of the URL are parameters, we can use a @javax.ws.rs.PathParam annotated parameter; for example:
@javax.ws.rs.Path("/bookstore/books/{bookId}") public class BooksCollection { @javax.ws.rs.GET public String getSpecificBookInfo(@javax.ws.rs.PathParam("bookId") String theBookId) { /* theBookId would contain the next path segment after /bookstore/books/ */ } }In this example, requests to.../bookstore/books/12345
...assigns the value of 12345 to the theBookId variable.
javax.ws.rs.MatrixParam Matrix parameters are part of the URL. For example, if the URL includes the path segment... /collection;itemID=itemIDValue
...the matrix parameter name is itemID and itemIDValue is the value.
We can read matrix parameters with a @javax.ws.rs.MatrixParam annotated parameter; for example:
@javax.ws.rs.Path("/bookstore/books") public class BooksCollection { @javax.ws.rs.GET public String getBookCollectionInfo(@javax.ws.rs.MatrixParam("page") int page, @javax.ws.rs.MatrixParam("filter") String filter) { /* This statement uses the page and filter parameters. */ } }In this example, requests to.../bookstore/books;page=25;filter=test
...invoke the getBookCollectionInfo parameter so that the value for the page variable is set to 25 and the value for filter variable is set to test.
javax.ws.rs.QueryParam Query parameters are appended to the URL after a "?" with name-value pairs. For instance, if the URL is... http://example.com/collection?itemID=itemIDValue
...the query parameter name is itemID and itemIDValue is the value. Query parameters are often used when filtering or paging through HTTP GET requests.
We can read query parameters with a @javax.ws.rs.QueryParam annotated parameter; for example:
@javax.ws.rs.Path("/bookstore/books") public class BooksCollection { @javax.ws.rs.GET public String getBookCollectionInfo(@javax.ws.rs.QueryParam("page") int page, @javax.ws.rs.QueryParam("filter") String filter) { /* This statement uses the page and filter parameters. */ } }In this example, requests to.../bookstore/books;page=25;filter=test
...invoke the getBookCollectionInfo parameter so that the value for the page variable is set to 25 and the value for filter variable is set to test.
javax.ws.rs.HeaderParam Header parameters are HTTP headers. While there are pre-defined HTTP headers, we can also use custom headers. Headers often contain control metadata information for the client, intermediary, or server.
If a HTTP request header must be read, use the @javax.ws.rs.HeaderParam annotation; for example:
@javax.ws.rs.Path("/bookstore/books/") public class BooksCollection { @javax.ws.rs.GET public String getBookCollectionInfo(@javax.ws.rs.HeaderParam("Range") String rangeValue) { /* The rangeValue variable contains the value of the HTTP request header "Range" */ } }In this example, requests to...
/bookstore/books/
...with a Range HTTP request header value of bytes=0-499 invokes the method with bytes=0-499 as the value for the rangeValue variable.
javax.ws.rs.CookieParam Cookie parameters are special HTTP headers. While cookies are associated with storing session identification or stateful data that is not accepted as RESTful, cookies can contain stateless information.
If an HTTP cookie is sent, such as mycustomid=customvalue123, we retrieve the value of mycustomid using:
@javax.ws.rs.Path("/bookstore/books/") public class BooksCollection { @javax.ws.rs.GET public String getBookCollectionInfo(@javax.ws.rs.CookieParam("mycustomid") String mycustomid) { /* The cookie value is passed to the mycustomid variable. */ } }javax.ws.rs.FormParam Form parameters are used when submitting a HTML form from a browser with a media type of application/x-www-form-urlencoded. The form parameters and values are encoded in the request message body in the form like the following:
firstParameter=firstValue&secondParameter=secondValue
The javax.ws.rs.FormParam annotation enables access to individual form parameter values.
If a form is submitted and the entity value is firstName=Bob&lastName=Smith, we can retrieve the values of the form parameters using:
@javax.ws.rs.Path("/customer") public class Custommer { @javax.ws.rs.POST public String postCustomerInfo(@javax.ws.rs.FormParam("firstName") String firstName, @javax.ws.rs.FormParam("lastName") String lastName) { /* firstName would be "Bob" and secondName would be "Smith" */ } }Avoid trouble: We can either use a single unannotated parameter to represent the message body or use multiple FormParam annotated parameters, but not both. Because the FormParam requires the request message body to be read and the message body is represented as a byte stream, the message body cannot be read again. The following code is not valid:
@javax.ws.rs.Path("/bookstore/books") public class BooksCollection { @javax.ws.rs.POST public String postSpecificBookInfo(@javax.ws.rs.FormParam("bookId") String theBookId, String theRequestEntity) { /* This code is invalid. Can only use FormParam or a request entity parameter like "String theRequestEntity" and not both */ } }gotcha
Choose one of the following ways to define variables to read parameters.
- Add a parameter to the resource method using annotations...
@javax.ws.rs.Path("/bookstore/books/") public class BooksCollection { @javax.ws.rs.GET public String getBookCollectionInfo(@javax.ws.rs.QueryParam("page") int page, @javax.ws.rs.QueryParam("filter") String filter) { /* This statement uses the page and filter parameters. */ } }Issuing an HTTP GET request using a web browser or other HTTP client, such as...http://host:port/context_root/servlet_path/bookstore/books?page=10&filter=FilterValue
...invokes the getBookCollectionInfo() method with the page set to 10 and filter set to FilterValue.
- Add the parameter annotation on the fields, JavaBeans properties, and constructor arguments...
@javax.ws.rs.Path("/bookstore/books/") public class BooksCollection { @javax.ws.rs.QueryParam("page") int page; String filter; @javax.ws.rs.QueryParam("filter") public void setFilter(String filter) { this.filter = filter; } @javax.ws.rs.GET public String getBookCollectionInfo() { /* This statement uses the page and filter parameters. */ } }Issuing an HTTP GET request using a web browser or other HTTP client, such as...http://host:port/context_root/servlet_path/bookstore/books?page=10&filter=FilterValue
...also invokes the getBookCollectionInfo() method with the page set to 10 and filter set to FilterValue.
Results
Your resource methods are defined so that they can be invoked with appropriate parameter values.
Related tasks
Define the resourcesDefine the URI patterns for resources Define resource methods Define the HTTP headers and response codes Define media types for resources