Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
Minist re de lenseignement Sup rieur, de la Recherche scientifiqu e et de la Technologie
Universit Virtuelle de Tunis
D veloppement Orient Services
D veloppement des Services Web REST
avec Java : JAX-RS
1
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
1. Introduction
Nous nous int ressons dans ce cours au d veloppement des services Web de type REST. C t
Serveur, nous montrons le code pour le traitement du service Web et c t Client nous d voilons
le code qui permet dappeler un service Web.
La majorit des langages de programmation orient s Web supportent le d veloppement de
services Web REST : Java, PHP, C#, C++, & Nous nous limitons au langage Java dans ce
cours. Comme il existe diff rents frameworks de d veloppement de Services Web, ceux qui
respectent la sp cification JAX-RS (d tailler apr s) et dautres comme Apache Axis2, &
2. JAX-RS
1. Sp cification
JAX-RS est lacronyme Java API for RESTful Web Services. Elle est d crite par la JSR 311
(jcp.org/en/jsr/summary?id=311) et la version courante de la sp cification est la 2.0. Depuis la
version 1.1, JAX-RS fait partie int grante de la sp cification Java EE 6 au niveau de la pile
des Services Web. Cette sp cification d crit uniquement la mise en oeuvre des services Web
REST c t serveur. Le d veloppement des Services Web REST repose sur lutilisation de
classes Java et dannotations.
2. Impl mentation
Il existe diff rentes impl mentations de la sp cification JAX-RS :
- JERSEY : impl mentation de r f rence fournie par Oracle (jersey.java.net)
- CXF : fournie par Apache, la fusion entre XFire et Celtix (cxf.apache.org)
- Spring REST : une API REST fournie par le framework Spring
(https://spring.io/guides/gs/rest-service/)
- RESTEasy : fournie par JBoss (www.jboss.org/resteasy)
- RESTlet : un des premiers framework impl mentant REST pour Java
(www.restlet.org)
Une tude comparative sur les performances des impl mentations peut tre trouv e dans
sp cification
www.java.dzone.com/articles/jax-rs-vendor-comparisons-part. Comme
JAXRS ne d crit pas la couche cliente, chaque impl mentation fournit une API sp cifique. Dans
la suite du cours nous utiliserons limpl mentation de r f rence JERSEY. Sa version actuelle
est la 2.5.1 qui respecte la sp cification JAX-RS 2.0. Jersey est incluse dans le serveur
dapplication Glassfish.
la
3. Fonctionnement
Les clients peuvent tre d velopp s en des diff rents langages. En ce qui concerne Java, il existe
diff rentes APIs qui g rent la partie client. Dans larchitecture REST les services web sont
utilis s en envoyant et recevant du contenu HTTP. Les requ tes sont re us par des servlets qui
vont la transmettre par la suite limpl mentation JAX-RS. Cette derni re int gre des classes
annot es impl mentant le service web.
2
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
4. D veloppement
Le d veloppement de Services Web avec JAX-RS est bas sur des POJO (Plain Old Java
Object) en utilisant des annotations sp cifiques JAX-RS. Il ny a une pas une de description
requise dans des fichiers de configuration, seule la configuration de la Servlet JAX-RS est
requise pour r aliser le pont entre les requ tes HTTP et les classes Java annot es.
Un Service Web REST est d ploy dans une application Web. Contrairement aux Services Web
tendus il ny a pas de possibilit de d velopper un service REST partir du fichier de
description WADL. Seule lapproche Bottom / Up qui est disponible : cr er et annoter un
POJO, compiler, d ployer et tester.
Exemple : Service Web REST HelloWorld
package isi.rest.service;
import &.
@Path("hello")
public class HelloWorldRessource {
@GET
@Produces(MediaType.TEXT_HTML)
public String sayHello() {
return "Hello World";
}
}
LURI @Path(/hello) permet de d finir le chemin de la ressource hello. La lecture de cette
ressource se fait gr ce une m thode de type GET de la requ te HTTP. Le type MIME de la
r ponse est de type text/html.
3
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
Le r sultat de la requ te est illustr dans la figure ci-dessus. Le retour est directement
interpr table depuis le navigateur puisquil sagit dun type MIME reconnu.
La ressource en lecture au service hello est accessible via une requ te HTTP travers la m thode
GET. Le retour est directement interpr table depuis un navigateur puisquil sagit dun type
MIME.
<?xml version="1.0" encoding="UTF-8"?>
<web-app &>
<display-name>HelloWorldRessource</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servletclass>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>isi.rest.service</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Structure dune application web
La structure illustr e ci-dessous est celle dune application web dynamique Java. Le r pertoire WEB-
INF comporte lensemble des classe java compil es .class, le r pertoire lib contient les
biblioth ques, dans le cas o le serveur dapplication les int gre il suffit davoir le serveur dans le
classpath de lapplication.
3. JAX-RS par lexemple
1. Syst me RESTFUL pour la gestion dune biblioth que
Nous allons illustrer dans ce qui suit la mise en place dun syst me RESTFUL dune biblioth que,
reposant sur un syst me CRUD.
4
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
Le syst me dispose de deux ressources qui sont la biblioth que et le livre. Une biblioth que poss de des
livres, o il est possible dajouter, de mettre jour ou de supprimer un livre. La recherche dun livre est
tablie selon diff rents crit res (JSBN, nom, &). Les donn es r cup r es sont de types simples (String,
Long, &) ou structur es. Enfin, diff rents formats de donn es peuvent tre utilis s comme JSON, XML,
&
2. Rappel sur le protocole HTTP
HTTP signifie Hyper Text Transfer Protocol, qui est un protocole de communication de type
client/serveur sans tat. Il est donc impossible de conserver des informations issues du client. La
conversion est initialis e par le client via une requ te HTTP, gr ce une URL qui est saisie dans le
navigateur. Requ te
Voici un la structure dune requ te HTTP envoy e par le client (navigateur) au serveur WWW :
<M thode> <URI> HTTP/<Version>
[<Champ den-t te>:<Valeur>] ...
Ligne blanche
- M thode : le type de m thode de la requ te qui peut tre GET, POST, &
- URI : ladresse du document demand qui peut tre un fichier HTML, une image, & -
Version : la version du protocole HTTP utilis qui est 1.0 ou 1.1
- Champ dent te : dans lequel figure diff rentes informations, comme le navigateur,
lutilisateur, &
- La ligne blanche est obligatoire
- Corps de la requ te : uniquement si la m thode est de type POST, dans lequel sont
fournies les valeurs des param tres envoy es par un formulaire.
Ent te
Lent te correspond aux formats de documents et aux param tres pour le serveur :
- Accept : types MIME accept s par le cilent (text/html, text/plain, &)
- Accpet-Encoding : le codage accept (compress, x-gzip, x-zip)
- Accpet-Charset : le jeu de caract res pr f r du client
- Accept-Language : la liste de langues (fr, en, de, &)
- Authorization : le type dautorisation : BASIC (nom :mot de passe en base 64), il est
transmis en clair et facile d crypter
- Cookie : cookie retourn
- From : adresse email de lutilisateur - &.
Type de m thodes
Lorsquun client se connecte un serveur et envoie une requ te, cette requ te peut- tre de
plusieurs types, appel s m thodes. Deux des m thodes les plus utilis es sont GET et POST.
La requ te de type GET permet dextraire des informations comme les documents, les
graphiques, & Elle int gre les donn es dans lURL, qui est la chaine de linterrogation, exemple
: www.biblio/book?title=SOA&author=Xavier Fournier
Advertisement
5
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
La requ te de type POST permet de poster des informations secr tes, des donn es graphiques,&
Elle est transmise dans le corps de la requ te.
POST /book.php HTTP/1.1
Host: www.biblio.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.9)
Gecko/2009040821 Firefox/3.0.9 (.NET CLR 3.5.30729) FirePHP/0.2.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Keep-Alive: 300
Connection: keep-alive
title=SOA&author=Xavier
Fournier
Voici la structure r ponse qui peut tre envoy e par le serveur WWW au client :
HTTP/<Version><Status><Commentaire Status>
Content-Type:<Type MIME du contenu>
[<Champ den-t te>:<Valeur>] ...
Ligne blanche
Document
Nous remarquons la pr sence de la version du protocole HTTP, avec cette fois le statut de la
r ponse li e une erreur ou une r ussite (200) et des informations (Commentaire) sur le statut
OK. Le type de contenu retourn est notamment sp cifi (text/html, text/plain,
application/octet-stream) et enfin le document qui peut tre format dun code HTML ou
autre.
3. Annotations de JAX-RS
@Path
Une classe Java doit tre annot e par lannotation @path pour quelle puisse tre trait e par des
requ tes HTTP. Cette annotation d finit des ressources appel es racines (Root Resource Class).
La valeur donn e @path correspond une expression URI relative au contexte de lapplication
web.
Exemple : http://localhost:8080/libraryrestwebservice/books
- localhost : adresse du serveur
- 8080 : port
- libraryrestwebservice : contexte de lapplication web
- books : URI de la ressource
Lannotation @path peut galement annoter des m thodes de la classe. LURI r sultante est la
concat nation de lexpression du @path de la classe avec lexpression du @path de la m thode.
6
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
Par exemple, on peut invoquer les livres pr t s dune biblioth que travers lURI
/books/borrowed, comme le montre lexemple ci-dessous :
@Path("/books") public class
BookResource {
@GET
public String getBooks() {
...
}
@GET
@Path("/borrowed")
String getBorrowedBooks() {
...
}
}
Template parameters
public
La valeur d finie dans @path ne se limite pas seulement aux expressions constantes. Il est aussi
possibile de d finir des expressions plus complexes appel es Template Parameters. Pour
distinguer une expression complexe dans la valeur du @path, son contenu est d limit par {&}.
Il est possible galement de mixer dans la valeur de @path des expressions constantes et des
expressions complexes. Les Template Parameters peuvent galement utiliser des expressions
r guli res Exemple :
@Path("/books/") public
class BookResource {
@GET
@Path("{id}")
public String getBookById(@PathParam("id") int id) {
return "SOA " + id;
}
@GET
@Path("name-{name}-editor-{editor}")
public String getBookByNameAndEditor(@PathParam("name") String name,
@PathParam("editor") String editor)
return "JAX-RS (Name:" + name + " - Editor:" + editor + ")";
}
}
Ainsi, on peut r cup rer un livre gr ce son identifiant (m thode getBookById) avec lURI
/books/123 par exemple. Comme il est possible de r cup rer un livre avec son nom et celui de
son diteur (m thode getBookByNameAndEditor) gr ce
/books/name-SOA-
editorDUNOD par exemple.
lURI
Sub-resource locator
Une sub-resource locator est une m thode qui doit respecter les exigences suivantes :
- Annot e avec @Path
- Non annot e avec @GET, @POST, @PUT, @DELETE
7
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
- Retourne une sous ressource (un type Object)
Lint r t dutiliser une m thode sub-resource locator est de pouvoir d l guer vers une autre
classe ressource. Le d veloppement dune sous ressource suit un sch ma classique, pas
dobligation de placer une ressource racine. Une m thode sub-resource locator supporte le
polymorphisme (retourne des sous types).
Lexemple suivant montre une m thode sub-resource locator (m thode getSpecificBook) dont
la sous ressource est d finie par SpecificBookResource. Il est donc possible de r cup rer un
livre de type SpecificBookResource avec son id, exemple travers lURI /books/specific/123.
@Path("/books/") public
class BookResource {
@Path("specific") public SpecificBookResource
getSpecificBook() {
SpecificBookResource();
return new
}
}
public class SpecificBookResource {
@GET
@Path("{id}")
public String getSpecificBookById(@PathParam("id") int id) {
return ".NET platform is Bad";
}
}
Traitement des donn es en tant quobjets complexes
JAX-RS peut traiter des objets complexes selon deux formats XML et JSON
JAX-RS et JAXB
JAX-RS permet lutilisation dobjets JAXB afin de manipuler des donn es en XML. Voici un
exemple :
M thodes HTTP travers les annotations
Lannotation des m thodes Java permet de traiter des requ tes HTTP suivant le type de m thode
(GET, POST, &). Les annotations disponibles par JAX-RS sont les suivantes : @GET,
@POST, @PUT, @DELETE et @HEAD. Ces annotations ne sont utilisables que sur des
m thodes Java. Le nom des m thodes Java na pas dimportance puisque cest lannotation
employ e qui pr cise o se fera le traitement. Il est possible aussi d tendre les annotations
disponibles pour g rer diff rents type de m thode HTTP travers par exemple le protocole
WebDav (extension au protocole HTTP pour la gestion de documents) et les m thodes
support es : PROPFIND, COPY, MOVE, LOCK, UNLOCK, &
La sp cification JAX-RS, nimpose pas de respecter les conventions d finies par le style REST.
Il est possible donc dutiliser une requ te HTTP de type GET pour effectuer une suppression
8
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
dune ressource. Des op rations CRUD sur des ressources sont r alis es au travers des
m thodes HTTP.
Exemple : CRUD sur la ressource Livre
@Path("/books/") public
class BookResource {
@GET
public String getBooks() {
"Cuisine et moi / JavaEE 18";
return
}
@POST
public String createBook(String livre) {
Advertisement
return livre;
}
@GET
@Path("{id}")
public String getBookById(@PathParam("id") int id) {
return "Java For Life " + id;
}
@PUT
@Path("{id}")
public void updateBookById(@PathParam("id") int id) {
...
}
@DELETE
@Path("{id}")
public void deleteBookById(@PathParam("id") int id) {
...
}
}
Dans cet exemple, getBooks permet de r cup rer la liste de tous les livres, createBook cr e un
nouveau livre, getBooksById r cup re un livre, updateBooksById permet de mettre jour u livre
et deleteBookById supprime un livre.
4. Param tres de requ tes
JAX-RS fournit des annotations pour extraire des param tres dune requ te. Elles sont utilis es
sur les param tres des m thodes des ressources pour r aliser linjection du contenu. La liste des
diff rentes annotations disponibles est la suivante :
- @PathParam : extraire les valeurs des Template Parameters
- @QueryParam : extraire les valeurs des param tres de requ te
- @FormParam : extraire les valeurs des param tres de formulaire
- @HeaderParam : extraire les param tres de len-t te
- @CookieParam : extraire les param tres des cookies
- @Context : extraire les informations li es aux ressources de contexte
Une valeur par d faut peut tre sp cifi e en utilisant lannotation @DefaultValue. Par d faut,
JAX-RS d code tous les param tres, la r solution de lencodage se fait par lannotation
@Encoded.
9
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
Les annotations peuvent tre utilis es sur les types Java suivants :
- Les types primitifs sauf char et les classes qui les encapsulent
- Toutes classes ayant un constructeur avec param tre de type String
- Toutes classes ayant la m thode statique valueOf(String)
- List<T>, Set<T> et SortedSet<T>
Lannotation @PathParam est utilis e pour extraire les valeurs des param tres contenues dans
les Template Parameters.
Exemple :
Dans cet exemple, la valeur de id est inject e dans la m thode getBookId pour r cup rer le livre
selon cet id.
@Path("/books/") public
class BookResource {
@GET
@Path("{id}")
public String getBookById(@PathParam("id") int id) {
return "Java For Life " + id;
}
@GET
@Path("name-{name}-editor-{editor}") public String
getBookByNameAndEditor(@PathParam("name") String name,
@PathParam("editor") String editor)
return "Name:" + name + " - Editor:" + editor;
}
}
Lannotation @QueryParam est utilis e pour extraire les valeurs des param tres contenues
dune requ te quel que soit son type de m thode HTTP.
Exemple :
Dans cet exemple, des valeurs par d faut peuvent tre inject es si les valeurs des param tres ne
sont pas fournies. Un exemple dURI de cette ressource :
/books/queryparameters?name=SOA&isbn=1-111111-11&isExtended=false
@Path("/books/") public
class BookResource {
@GET
@Path("queryparameters")
public String getQueryParameterBook(
@DefaultValue("all") @QueryParam("name") String name,
@DefaultValue("?-???????-?") @QueryParam("isbn") String isbn,
@DefaultValue("false") @QueryParam("isExtended") boolean isExtented)
return name + " " + isbn + " " + isExtented;
{
}
10
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
}
Lannotation @FormParam est utilis e pour extraire les valeurs des param tres contenues dans
un formulaire. Le type de contenu doit tre application/x-www-form-urlencoded. Cette
annotation est tr s utile pour extraire les informations dune requ te POST dun formulaire
HTML.
Exemple :
@Path("/books/") public
class BookResource {
@POST
@Path("createfromform")
@Consumes("application/x-www-form-urlencoded")
public String createBookFromForm(@FormParam("name") String name) {
System.out.println("BookResource.createBookFromForm()");
return name;
}
}
Lannotation @HeaderParam est utilis e pour extraire les valeurs des param tres contenues
dans len-t te dune requ te.
Exemple :
@Path("/books/") public
class BookResource {
@GET
@Path("headerparameters")
public String getHeaderParameterBook(
@DefaultValue("all") @HeaderParam("name") String name,
@DefaultValue("?-???????-?") @HeaderParam("isbn") String isbn,
@DefaultValue("false") @HeaderParam("isExtended") Boolean
return name + " " + isbn + " " + isExtented;
isExtented) {
}
}
Lannotation @Context permet dinjecter des objets li s au contexte de lapplication. Les types
dobjets support s sont les suivants :
- UriInfo : informations li es aux URIs
- Request : informations li es au traitement de la requ te
- HttpHeaders : informations li es len-t te
- SecurityContext : informations li es la s curit
Certains de ces objets permettent dobtenir les m mes informations que les pr c dentes
annotations li es aux param tres.
Un objet de type UriInfo permet dextraire les informations brutes dune requ te HTTP. Les
principales m thodes sont les suivantes :
11
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
- String getPath() : chemin relatif de la requ te
- MultivaluedMap<String, String> getPathParameters() : valeurs des param tres de la
requ te contenues dans Template Parameters.
- MultivaluedMap<String, String> getQueryParameters() : valeurs des param tres de la
requ te
- URI getBaseUri() : chemin de lapplication
- URI getAbsolutePath() : chemin absolu (base + chemins)
- URI getRequestUri() : chemin absolu incluant les param tres
Exemple : acc der aux informations dune requ te via UriInfo
http://localhost:8080/restws/books/informationfromuriinfo/test?toto=ddd
@Path("/books/") public
class BookResource {
@GET
@Path("informationfromuriinfo/{name}")
getInformationFromUriInfo(@Context UriInfo uriInfo,
public String
@PathParam("name") String name) {
System.out.println("getPath(): " + uriInfo.getPath());
List<PathSegment> pathSegments = uriInfo.getPathSegments();
MultivaluedMap<String, String> pathParameters =
uriInfo.getPathParameters();
MultivaluedMap<String, String> queryParameters =
uriInfo.getQueryParameters();
System.out.println("getAbsolutePath(): " +uriInfo.getAbsolutePath());
System.out.println("getBaseUri(): " + uriInfo.getBaseUri());
System.out.println("getRequestUri(): " + uriInfo.getRequestUri());
return "";
}
}
Un objet de type HttpHeader permet dextraire les informations contenues dans len-t te dune
requ te. Les principales m thodes sont les suivantes :
- Map<String, Cookie> getCookies() : les cookies de la requ te
- Locale getLanguage() : le langue de la requ te
- MultivaluedMap<String, String> getRequestHeaders() : valeurs des param tres de
lent te de la requ te
Advertisement
- MediaType getMediaType() : le type MIME de la requ te
A noter que ces m thodes permettent dobtenir le m me r sultat que les annotations
@HeaderParam et @CookieParam.
12
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
@Path("/books/") public
class BookResource {
@GET
@Path("informationfromhttpheaders/{name}") public String
getInformationFromHttpHeaders(@Context HttpHeaders
httpheaders) {
Map<String, Cookie> cookies = httpheaders.getCookies();
Set<String> currentKeySet = cookies.keySet();
for (String currentCookie : currentKeySet) {
System.out.println(currentCookie);
}
httpheaders.getRequestHeaders();
MultivaluedMap<String, String> requestHeaders =
Set<String> requestHeadersSet = requestHeaders.keySet();
for (String currentHeader : requestHeadersSet) {
System. out .println(currentHeader);
}
return "" ;
}
}
Lannotation @Consumes est utilis e pour sp cifier le ou les
dune ressource peut accepter. Lannotation @Produces est utilis e pour sp cifier le ou les
types MIME quune m thode dune ressource peut produire. Il est possible de d finir un ou
plusieurs types MIME. Ces annotations peuvent tre port es sur une classe ou sur une
m thode. Lannotation sur la m thode surcharge celle de la classe. Si ces annotations ne sont
pas utilis es tous types MIME pourront tre accept s ou produits. La liste des constantes des
diff rents types MIME est disponible dans la classe MediaType.
Exemple : Gestion de type MIME
types MIME quune m thode
Type MIME accept par le client :
GET /books/details/12 HTTP/1.1
Host: localhost
Accept: text/html
Type MIME du contenu retourn saccorde par rapport ce qui est support par le client :
HTTP/1.1 200 OK
Date: Wed, 05 January 2010 14:44:55 GMT
Server: Jetty(6.1.14)
Content-Type: text/html
<html>
<title>Details</title>
<body>
13
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
<h1>Ce livre est une introduction sur la vie</h1>
</body> </html>
Dans le code qui suit, le chemin des trois m thodes est identique. Le choix de la m thode
d clench e d pend du type MIME support par le client :
@Path("/books/")
public class BookResource {
@GET
@Path("details/{id}")
@Produces(MediaType.TEXT_PLAIN)
public String getDetailTextBookId(@PathParam("id") String id) {
return "Ce livre est une introduction sur la vie";
}
@GET
@Path("details/{id}") @Produces(MediaType.TEXT_XML) public
return
String getDetailXMLBookId(@PathParam("id") String id) {
"<?xml version=\"1.0\"?>" + "<details>Ce livre est une
";
>
<
introduction sur la v ie " + "
/details
}
@ GET
@ Path( "details/{id}" )
@ Produces(M ediaType.TEXT_HTML)
public String getDetailHTMLBookId( @ PathParam( "id" ) String id) {
return "<html> " + "<title>" + "Details" + "</title>" + "<body><h1>"
+ "Ce livre e st une introduction sur la vie " + " /body></h 1>
" < /h tml> ";
<
" +
}
}
5. Gestion du contenu
Pr c demment nous sommes focalis s sur les informations contenues dans len-t te dune
requ te. JAX-RS permet galement de manipuler le contenu du corps dune requ te et dune
r ponse. Il peut ainsi automatiquement effectuer des op rations de s rialisation et
d s rialisation vers un type Java sp cifique :
- / : byte[]
- text/* : String
- text/xml, application/xml, application/*+xml : JAXBElement
- application/x-www-form-urlencoded : MultivalueMap<String,String>
Dans la suite nous montrerons des exemples c t serveur qui illustrent la manipulation des types
Java.
Exemple : Requ te et r ponse avec un flux dentr e
14
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
@Path("/contentbooks/") public
class BookResource {
@PUT
@Path("inputstream")
public void updateContentBooksWithInputStream(InputStream is) throws
IOException {
byte[] bytes = readFromStream(is);
String input = new String(bytes);
System.out.println(input);
}
private byte[] readFromStream(InputStream stream) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1000]; int wasRead = 0;
(wasRead > 0) { baos.write(buffer, 0, wasRead); }
wasRead = stream.read(buffer);
do {
if
} while (wasRead > -1);
return baos.toByteArray();
}
@Path("inputstream")
@GET
@Produces(MediaType.TEXT_XML)
public InputStream
getContentBooksWithInputStream() throws
FileNotFoundException {
return new FileInputStream( "c: \ \ example.xml" ) ;
}
}
Exemple : Requ te et r ponse avec un fichier
Dans cet exemple, JAX-RS cr e un fichier temporaire partir du fichier donn (m thode
getContentBooksWithFile)
@Path("/contentbooks/") public
class BookResource {
@Path("file")
@PUT
public void updateContentBooksWithFile(File file) throws IOException {
byte[] bytes = readFromStream(new FileInputStream(file));
String input = new String(bytes);
System.out.println(input);
}
@Path("file")
@GET
@Produces(MediaType.TEXT_XML)
public File getContentBooksWithFile() {
File file = new File("c:\\example.xml");
return file;
15
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
Advertisement
}
}
Exemple : Requ te et r ponse avec un String
@Path("/contentbooks/") public
class BookResource {
@PUT
public void updateContentBooksWithString(String current) throws IOException
{
System.out.println(current);
}
@Path("string")
@GET
@Produces(MediaType.TEXT_XML)
public String getContentBooksWithString() {
return "<?xml version=\"1.0\"?>" + "<details>Ce livre est une
introduction sur la vie" +
"</details>";
}
}
Actuellement nous avons employ les types disponibles fournis par Java. JAX-RS offre la
possibilit dutiliser directement des types personnalis s en sappuyant sur la sp cification
JAXB. Ce dernier JAXB est d fini par la JSR 222, qui est une sp cification permettant de
mapper des classes Java en XML et en XML Schema. Lavantage est de pouvoir manipuler
directement des objets Java sans passer par une repr sentation abstraite XML. Chaque classe
est annot e pour d crire la mapping entre lXML Schema et les informations de la classe :
XmlRootElement, XmlElement, XmlType, &
JAX-RS supporte la s rialisation et la d -s rialisation de classes qui sont annot es par
@XmlRootElement, @XmlType ou envelopp es par un objet JAXBElement. Le format du
contenu dune requ te et dune r ponse peut tre repr sent par de lXML ou du JSON. Ces
formes de contenu sont d finies par les annotations @Produces et @Consumes, qui peuvent
tre de type :
- XML : text/xml, application/xml, application/*+xml
- JSON : application/json
La manipulation de types personnalis s oblige de pr ciser dans le service le type MIME traiter
et retourner.
JAX-RS et JAXB
Exemple : mise jour dun livre (format XML)
Dans cet exemple, lannotation JAXB XmlRootElement(name = "book") d finit l l ment
racine de larbre XML.
16
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
@XmlRootElement(name = "book")
@XmlAccessorType(XmlAccessType.FIELD) public
class Book {
@XmlElement
protected String name;
@XmlElement
protected String isbn;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String toString() {
return name;
}
}
Dans la ressource BookResource, le type MIME retourn par le service (m thode
getContentBookWithJAXBXML) permet de conna tre le format traiter.
@Path("/contentbooks/") public class BookResource
{
@Path("jaxbxml")
@Consumes("application/xml")
@PUT
public void updateContentBooksWithJAXBXML(Book current) throws IOException
{
current.getIsbn());
System.out.println("Name: " + current.getName() + ", ISBN: " +
}
@Path("jaxbxml")
@GET
@Produces("application/xml")
public Book getContentBooksWithJAXBXML() {
Book current = new Book();
current.setIsbn("123-456-789");
current.setName("SOA");
return
current;
}
}
LURL /contentbooks/jaxbxml rend le r sultat suivant :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
17
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
<xs:element name="book" type="book"/>
<xs:complexType name="book">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="isbn" type="xs:string"/>
</xs:sequence>
<xs:complexType>
</xs:schema>
Exemple : Mise jour dun livre (JAXBElement et format XML)
Dans cet exemple, un objet JAXBElement est utilis pour envelopper le type Book. Lacc s
direct lobjet Book se fait par la m thode getValue().
@Path("/contentbooks") public
class BookResource {
@Path("jaxbxml")
@Consumes("application/xml")
@POST
public void updateContentBooksWithJAXBElementXML(JAXBElement<Book>
currentJAXBElemnt) {
Book current = currentJAXBElemnt.getValue();
System.out.println("Name: " + current.getName() + ", ISBN: " +
current.getIsbn());
}
}
Lors de lenvoie de la r ponse au client un code statut est retourn . Les statuts des r ponses sans
erreur s chelonnent de 200 399. Le code est 200 OK pour les services retournant un
contenu non vide. Le code est 204 No Content pour les services retournant un contenu vide.
Pour les r ponses avec erreur, leurs statuts s chelonnent de 400 599. Pour une ressource non
trouv e, le code de retour est 404 Not Found . Pour un type MIME en retour non support ,
le code retourn est 406 Not Acceptable . Enfin pour une m thode HTTP non support e, le
code retourn est 405 Method Not Allowed .
JAX-RS et JSON
JAX-RS permet de manipuler des donn es en JSON gr ce des biblioth ques tierces telles
JAXB, Jackson,& Dans lexemple qui suit nous exploitons le m me objet Book qui est mapp
un XSD gr ce JAXB. Cette approche permet donc dutiliser le m me objet pour un rendu en
XML ou JSON :
@Path("/contentbooks/") public class
BookResource {@Path("jaxbxml")
@Path("jaxbjson")
@GET
18
Universit Virtuelle de Tunis D veloppement Orient Services
Services Web avec JAX-RS
@Produces("application/json")
public Book getContentBooksWithJAXBJSON() {
Book current = new Book();
current.setIsbn("123-456-789");
current.setName("SOA");
return
current;
}
}
Le rendu JSON est le su...