Accept: */*
header which details which media types the client can accept. The server simply returns whatever we have coded for example @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
.
However I bet a number of you have seen something like this before:
http://www.example.com/documents/mydoc?format=docThe first example is not very subtle. It tells you the client wants a mydoc.doc by requesting a specific format. The second example is more subtle, and the end user (client) may not notice. I made it a "little" more obvious by changing it to .xml. However, most folks would have missed it if I used mydoc.doc. You would have assumed it was a MS Word document to start with. In actuality, the media type returned here is controlled by the file extension.
http://www.example.com/documents/mydoc.xml
Note: Updated the source code to include header based negotiation, but this is just mimicking server content negotiation.
In the attached Apache Maven project developed on NetBeans 7.1: jersey-content-negotiation.zip. I demonstrate how to do it.
The first example returns JSON by default, and other media formats as requested. If it does not understand the media type requested, it simply returns plain text.
On the second example which uses the media type extension, I return a 400 - Bad Request instead of plain text like the first example. This subtlety is based on the fact that the client is requesting a specific type based on extension. If you ask for .pdf and get .txt, the result may cause an unanticipated consequence so it is better to throw an exception.
The mixed media type returns are possible because of the
Response
being wrapped as demonstrated in a previous post: JAX-RS Tip of the Day: Use Response to wrap... Responses.ContentNegotiationResource.java
Client Negotiation Examples |
No comments:
Post a Comment