Académique Documents
Professionnel Documents
Culture Documents
Licence
Creative Commons
Contrat Paternit Partage des Conditions Initiales l'Identique
2.0 France
keulkeul.blogspot.com
http://creativecommons.org/licenses/by-sa/2.0/fr
JAX-RS - M. Baron - Page 2
Plan du cours Gnralits JAX-RS Premier service Web JAX-RS Rappels HTTP (Requte et Rponse) Dveloppement Serveur
Chemin de ressource @Path Paramtres des requtes
keulkeul.blogspot.com
Logiciels utiliss
Navigateur Web, Eclipse 3.6, Tomcat 6, Maven 3 Exemples Maveniss indpendant de lenvironnement de dv.
keulkeul.blogspot.com
Pr-requis
Schema XML, JAXB, Introduction Services Web
Remerciements
Djug
Articles
www.oracle.com/technetwork/articles/javase/index-137171.html wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features jsr311.java.net/nonav/releases/1.1/index.html en.wikipedia.org/wiki/JAX-RS
keulkeul.blogspot.com
Prsentations
www.slideshare.net/caroljmcdonald/td09restcarol www.slideshare.net/linkedin/building-consistent-restful-apis-in-a-highperformance-environment www.slideshare.net/jugtoulouse/rest-nicolas-zozol-jug-toulouse-20100615 developers.sun.com/learning/javaoneonline/2008/pdf/TS-5425.pdf
keulkeul.blogspot.com
Cours
jersey.java.net/nonav/documentation/latest/user-guide.html
Gnralits - Dveloppement de Services Web REST Nous nous intressons dans ce cours au dveloppement des services Web de type REST
Ct Serveur : code pour le traitement du service Web Ct Client : code qui permet dappeler un service Web
La majorit des langages de programmation orients Web supportent le dveloppement de services Web REST
Java, PHP, C#, C++,
Gnralits JAX-RS : la spcification JAX-RS est lacronyme Java API for RESTful Web Services Dcrite par la JSR 311 (jcp.org/en/jsr/summary?id=311) Version courante de la spcification est la 1.1 Depuis la version 1.1, JAX-RS fait partie intgrante de la spcification Java EE 6 au niveau de la pile Service Web Cette spcification dcrit uniquement la mise en uvre de
keulkeul.blogspot.com
services Web REST ct serveur Le dveloppement des Services Web REST repose sur lutilisation de classes Java et dannotations JAX-RS
- M. Baron - Page 9
Gnralits JAX-RS : les implmentations Diffrentes implmentations de la spcification JAX-RS sont disponibles JERSEY : implmentation de rfrence fournie par Oracle
Site projet : jersey.java.net
Gnralits JAX-RS : les implmentations Comparaisons sur les performances des implmentations
java.dzone.com/articles/jax-rs-vendor-comparisons-part www.infoq.com/news/2008/10/jaxrs-comparison
Comme la spcification JAX-RS ne dcrit pas la couche cliente, chaque implmentation fournit une API spcifique Dans la suite du support de cours nous utiliserons limplmentation de rfrence JERSEY
Version actuelle 1.4 respectant la spcification JAX-RS 1.1 Intgre dans Glassfish et limplmentation Java EE 6
keulkeul.blogspot.com
.NET
WADL
Servlet PHP
JAX-RS
HTTP
Serveur Web Approche Bottom / Up
JAVA
keulkeul.blogspot.com
Couche Serveur
Gnralits JAX-RS : Dveloppement Le dveloppement de Services Web avec JAX-RS est bas sur des POJO (Plain Old Java Object) en utilisant des annotations spcifiques JAX-RS Pas description rquise dans des fichiers de configuration Seule la configuration de la Servlet JAX-RS est requise
keulkeul.blogspot.com
pour raliser le pont entre les requtes HTTP et les classes Java annotes Un Service Web REST est dploy dans une application Web
JAX-RS - M. Baron - Page 13
Gnralits JAX-RS : Dveloppement Contrairement aux Services Web tendus il ny a pas de possibilit de dvelopper un service REST partir du fichier de description WADL Seule lapproche Bottom / Up est disponible
Crer et annoter un POJO Compiler, Dployer et Tester Possibilit daccder au document WADL
keulkeul.blogspot.com
Le fichier de description WADL est gnr automatiquement par JAX-RS (exemple : http://host/context/application.wadl) Plus tard nous verrons comment utilis WADL pour gnrer la couche cliente
JAX-RS - M. Baron - Page 14
@Path("/hello") public class HelloWorldResource { @GET @Produces("text/plain") public String getHelloWorld() { return "Hello World from text/plain"; } }
keulkeul.blogspot.com
HelloWorldResource.java du projet
HelloWorldRestWebService
JAX-RS - M. Baron - Page 15
Le Premier Service Web JAX-RS Exemple (suite) : Service Web REST HelloWorld
Envoie dune requte HTTP de type GET demandant la lecture de la ressource hello
keulkeul.blogspot.com
Le retour est directement interprtable depuis la navigateur puisquil sagit dun type MIME reconnu
Plus tard, nous utiliserons des outils qui facilitent lcriture de requtes HTTP plus complexes (POST, PUT, )
Le Premier Service Web JAX-RS Exemple (suite) : Service Web REST HelloWorld
Structure dune application Web classique Java
index.html
WEB-INF
HelloWorldRestWebService.war
classes
lib
keulkeul.blogspot.com
Les bibliothques ne sont pas obligatoires dans le cas o le serveur dapplication les intgre
JAX-RS - M. Baron - Page 17
Le Premier Service Web JAX-RS Exemple (suite) : Service Web REST HelloWorld
Servlet fournie par Jersey pour le traitement des requtes HTTP
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...> <display-name>HelloWorldRestWebService</display-name> <servlet> <servlet-name>HelloWorldServletAdaptor</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>fr.ensma.lisi.helloworldrestwebservice</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>HelloWorldServletAdaptor</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> Dans la partie Dploiement
keulkeul.blogspot.com
web.xml du projet
HelloWorldRestWebService
Exemple file rouge : une bibliothque Utilisation dun exemple reprsentatif pour la prsentation des concepts de JAX-RS : une Bibliothque Mise en place dun systme de CRUD Bibliothque et livre sont des ressources Description de lexemple
Une bibliothque dispose de livres Possibilit dajouter, de mettre jour ou de supprimer un livre
keulkeul.blogspot.com
Recherche dun livre en fonction de diffrents critres (ISBN, nom, ) Rcupration de donnes de types simples (String, Long, ) ou structures Diffrents formats de donnes (JSON, XML, )
JAX-RS - M. Baron - Page 19
Protocole HTTP : gnralits Hyper Text Transfer Protocol v1.1 Protocole Client/Serveur sans tat
Impossibilit de conserver des informations issu du client
La conversation HTTP est initialise lorsque lURL est saisie dans le navigateur
1 - le client ouvre la connexion avec le serveur 2 - le client met une requte HTTP
keulkeul.blogspot.com
Protocole HTTP : requte Requte envoye par le client (navigateur) au serveur WWW
Le type de mthode de la requte GET, POST, ... Document demand. Fichier HTML, une image, ... Protocole HTTP avec la version : 1.0 ou 1.1
<Mthode> <URI> HTTP/<Version> [<Champ den-tte>:<Valeur>] ... Ligne blanche [corps de la requte pour la mthode Post]
keulkeul.blogspot.com
Le corps de la requte uniquement si la mthode est de type POST. Sont fournis les valeurs des paramtres envoyes par un formulaire
Protocole HTTP : en-ttes de requte Correspond aux formats de documents et aux paramtres pour le serveur
Accept = types MIME accepts par le client (text/html, text/plain, ) Accept-Encoding = codage acceptes (compress, x-gzip, x-zip) Accept-Charset = jeu de caractres prfr du client Accept-Language = liste de langues (fr, en, de, ) Authorization = type dautorisation
BASIC nom:mot de passe (en base64)
keulkeul.blogspot.com
Protocole HTTP : type de mthodes Lorsquun client se connecte un serveur et envoie une requte, cette requte peut-tre de plusieurs types, appels mthodes Requte de type GET
Pour extraire des informations (document, graphique, ) Intgre les donnes de formatage lURL (chane dinterrogation)
www.exemple.com/hello?key1=titi&key2=raoul&
Pour poster des informations secrtes, des donnes graphiques, Transmis dans le corps de la requte
<Mthode> <URI> HTTP/<Version> [<Champ den-tte>:<Valeur>] ... Ligne blanche [corps de la requte pour la mthode Post]
Protocole HTTP : rponse Rponse envoye par le serveur WWW au client (navigateur)
Protocole HTTP avec la version : 1.0 ou 1.1 Statuts des rponses HTTP. Lies une erreur ou une russite : 200 Donne des informations sur le statut : OK
HTTP/<Version><Status><Commentaire Status> Content-Type:<Type MIME du contenu> [<Champ den-tte>:<Valeur>] ... Ligne blanche Document keulkeul.blogspot.com
Protocole HTTP : en-ttes de rponse Correspond aux informations concernant le serveur WWW
Accept-Ranges = accepte ou refus dune requte par intervalle Age = anciennet du document en secondes Server = information concernant le serveur qui retourne la rponse WWW-Authenticate = systme dauthentification. Utiliser en couple
avec len-tte requte Authorization
keulkeul.blogspot.com
ETag = Location =
@Path Une classe Java doit tre annote par @path pour quelle puisse tre traite par des requtes HTTP Lannotation @path sur une classe dfinit des ressources appeles racines (Root Resource Class) La valeur donne @path correspond une expression URI relative au contexte de lapplication Web
http://localhost:8088/libraryrestwebservice/books
keulkeul.blogspot.com
Adresse du Serveur
Port
URI de la ressource
Des informations sur la mise en place du contexte dune application Web sont disponibles dans le cours sur les Servlets
@Path Lannotation @path peut galement annoter des mthodes de la classe (facultatif) LURI rsultante est la concatnation de lexpression du @path de la classe avec lexpression du @path de la mthode Exemple
Requtes HTTP de types GET
@Path("/books") public class BookResource { @GET public String getBooks() { ... } @GET @Path("/borrowed") public String getBorrowedBooks() { ... } }
/books /books/borrowed
keulkeul.blogspot.com
Serveur Web
BookResource.java du projet
LibraryRestWebService
Conteneur de Servlets
@Path : Template Parameters La valeur dfinie dans @path ne se limite pas seulement aux expressions constantes Possibilit de dfinir des expressions plus complexes appeles Template Parameters Pour distinguer une expression complexe dans la valeur du
Possibilit galement de mixer dans la valeur de @path des expressions constantes et des expressions complexes Les Template Parameters peuvent galement utiliser des expressions rgulires
JAX-RS - M. Baron - Page 29
keulkeul.blogspot.com
/books/name-sc2-editor-oreilly
BookResource.java du projet
LibraryRestWebService
JAX-RS - M. Baron - Page 30
@Path : Template Parameters Exemple (bis) : Rcuprer un livre par son identifiant
/books/123/path1/path2/editor
@Path("/books") public class BookResource { ... @GET @Path("{id : .+}/editor") public String getBookEditorById(@PathParam("id") String id) { return "OReilly"; } @GET @Path("original/{id : .+}") public String getOriginalBookById(@PathParam("id") String id) { return "Java For Life 2"; } }
keulkeul.blogspot.com
BookResource.java du projet
LibraryRestWebService
/books/original/123/path1/path2
JAX-RS - M. Baron - Page 31
@Path : Sub-resource locator Une sub-resource locator est une mthode qui doit respecter les exigences suivantes
Annote avec @Path Non annote avec @GET, @POST, @PUT, @DELETE Retourne une sous ressource (un type Object)
Lintrt dutiliser une mthode sub-resource locator est de pouvoir dlguer vers une autre classe ressource
keulkeul.blogspot.com
Le dveloppement dune sous ressource suit un schma classique, pas dobligation de placer une ressource racine Une mthode sub-resource locator supporte le polymorphisme (retourne des sous types)
JAX-RS - M. Baron - Page 32
Mthode Sub-resource locator dont la sous ressource est dfinie par SpecificBookResource
public class SpecificBookResource { @GET @Path("{id}") public String getSpecificBookById(@PathParam("id") int id) { return ".NET platform is Bad"; } }
keulkeul.blogspot.com
SpecificBookResource.java du projet
LibraryRestWebService
/books/specific/123
JAX-RS - M. Baron - Page 33
@GET, @POST, @PUT, @DELETE : Mthodes HTTP Lannotation des mthodes Java permet de traiter de requtes HTTP suivant le type de mthode (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 mthodes Java Le nom des mthodes Java na pas dimportance puisque cest lannotation employe qui prcise o se fera le traitement
keulkeul.blogspot.com
Possibilit dtendre les annotations disponibles pour grer diffrents type de mthode HTTP
Protocole WebDav (extension au protocole HTTP pour la gestion de documents) Mthodes supportes : PROPFIND, COPY, MOVE, LOCK, UNLOCK,
JAX-RS - M. Baron - Page 34
@GET, @POST, @PUT, @DELETE : Mthodes HTTP La spcification JAX-RS, nimpose pas de respecter les conventions dfinies par le style REST
Possibilit dutiliser une requte HTTP de type GET pour effectuer une suppression dune ressource
Des oprations CRUD sur des ressources sont ralises au travers des mthodes HTTP
/books
GET : rcupre la liste de tous les livres POST : crer un nouveau livre
keulkeul.blogspot.com
/books/{id}
GET : rcupre un livre PUT : mise jour dun livre DELETE : effacer un livre Serveur Web Conteneur de Servlets
@GET, @POST, @PUT, @DELETE : Mthodes HTTP Exemple : CRUD sur la ressource Livre
@Path("/books") public class BookResource { @GET public String getBooks() { return "Cuisine et moi / JavaEE 18"; } @POST public String createBook(String livre) { 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) { ... } }
Rcupre un livre
keulkeul.blogspot.com
Effacer un livre
BookResource.java du projet
LibraryRestWebService
JAX-RS - M. Baron - Page 36
Paramtres de requtes JAX-RS fournit des annotations pour extraire des paramtres dune requte Elles sont utilises sur les paramtres des mthodes des ressources pour raliser linjection du contenu Liste des diffrentes annotations disponibles
@PathParam : extraire les valeurs des Template Parameters @QueryParam : extraire les valeurs des paramtres de requte
keulkeul.blogspot.com
@FormParam : extraire les valeurs des paramtres de formulaire @HeaderParam : extraire les paramtres de len-tte @CookieParam : extraire les paramtres des cookies @Context : extraire les informations lies aux ressources de contexte
JAX-RS - M. Baron - Page 37
Paramtres de requtes : fonctionnalits communes Une valeur par dfaut peut tre spcifie en utilisant lannotation @DefaultValue Par dfaut, JAX-RS dcode tous les paramtres, la rsolution de lencodage se fait par lannotation @Encoded Les annotations peuvent tre utilises sur les types Java suivants
keulkeul.blogspot.com
Les types primitifs sauf char et les classes qui les encapsulent Toutes classes ayant un constructeur avec paramtre de type String Toutes classes ayant la mthode statique valueOf(String)
Paramtres de requtes : @PathParam Lannotation @PathParam est utilise pour extraire les valeurs des paramtres contenues dans les Template Parameters Exemple
@Path("/books") public class BookResource { ...
/books/123/path1/path2/editor
Injecte les valeurs dans les paramtres de la mthode
@GET @Path("{id}") public String getBookById(@PathParam("id") int id) { return "Java For Life " + id; }
/books/name-sc2-editor-oreilly
keulkeul.blogspot.com
@GET @Path("name-{name}-editor-{editor}") public String getBookByNameAndEditor(@PathParam("name") String name, @PathParam("editor") String editor) return "Starcraft 2 for Dummies (Name:" + name + " - Editor:" + editor + ")"; } }
BookResource.java du projet
LibraryRestWebService
JAX-RS - M. Baron - Page 39
Paramtres de requtes : @QueryParam Lannotation @QueryParam est utilise pour extraire les valeurs des paramtres contenues dune requte quelque soit son type de mthode HTTP Exemple
/books/queryparameters?name=harry&isbn=1-111111-11&isExtended=true
@Path("/books") Injection de valeurs par dfaut public class BookResource { ... si les valeurs des paramtres @GET ne sont pas fournies @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; } }
keulkeul.blogspot.com
BookResource.java du projet
LibraryRestWebService
JAX-RS - M. Baron - Page 40
Paramtres de requtes : @FormParam Lannotation @FormParam est utilise pour extraire les valeurs des paramtres contenues dans un formulaire Le type de contenu doit tre application/x-www-form-urlencoded Cette annotation est trs utile pour extraire les informations dune requte 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; } }
keulkeul.blogspot.com
BookResource.java du projet
LibraryRestWebService
JAX-RS - M. Baron - Page 41
Paramtres de requtes : @HeaderParam Lannotation @HeaderParam est utilise pour extraire les valeurs des paramtres contenues dans len-tte dune requte 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 isExtented) { return name + " " + isbn + " " + isExtented; } }
keulkeul.blogspot.com
BookResource.java du projet
LibraryRestWebService
JAX-RS - M. Baron - Page 42
Paramtres de requtes : @Context Lannotation @Context permet dinjecter des objets lis au contexte de lapplication Les types dobjets supports sont les suivants
UriInfo : informations lies aux URIs Request : informations lies au traitement de la requte HttpHeaders : informations lies len-tte
keulkeul.blogspot.com
Certains de ces objets permettent dobtenir les mmes informations que les prcdentes annotations lies aux paramtres
JAX-RS - M. Baron - Page 43
Paramtres de requtes : @Context / UriInfo Un objet de type UriInfo permet dextraire les informations brutes dune requte HTTP Les principales mthodes sont les suivantes
String getPath() : chemin relatif de la requte MultivaluedMap<String, String> getPathParameters() : valeurs des
paramtres de la requte contenues dans Template Parameters
URI getAbsolutePath() : chemin absolu (base + chemins) URI getRequestUri() : chemin absolu incluant les paramtres
Nous reviendrons sur lobjet UriInfo pour manipuler le constructeur dURI (UriBuilder)
Paramtres de requtes : @Context / UriInfo Exemple : accder aux informations dune requte via UriInfo
http://localhost:8088/libraryrestwebservice/books/informationfromuriinfo/test?toto=ddd
@Path("/books") public class BookResource { BookResource.java du projet ... LibraryRestWebService @GET @Path("informationfromuriinfo/{name}") public String getInformationFromUriInfo(@Context UriInfo uriInfo, @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 ...; } }
keulkeul.blogspot.com
Paramtres de requtes : @Context / HttpHeaders Un objet de type HttpHeader permet dextraire les informations contenues dans len-tte dune requte Les principales mthodes sont les suivantes
Map<String, Cookie> getCookies() : les cookies de la requte Locale getLanguage() : le langue de la requte MultivaluedMap<String, String> getRequestHeaders() : valeurs des
paramtres de len-tte de la requte
keulkeul.blogspot.com
A noter que ces mthodes permettent dobtenir le mme rsultat que les annotations @HeaderParam et @CookieParam
JAX-RS - M. Baron - Page 46
keulkeul.blogspot.com
BookResource.java du projet
LibraryRestWebService
JAX-RS - M. Baron - Page 47
Reprsentations : @Consumes, @Produces Lannotation @Consumes est utilise pour spcifier le ou les types MIME quune mthode dune ressource peut accepter Lannotation @Produces est utilise pour spcifier le ou les types MIME quune mthode dune ressource peut produire Possibilit de dfinir un ou plusieurs types MIME Ces annotations peuvent portes sur une classe ou sur une mthode
Lannotation sur la mthode surcharge celle de la classe
keulkeul.blogspot.com
Si ces annotations ne sont pas utilises tous types MIME pourront tre accepts ou produits La liste des constantes des diffrents type MIME est disponible dans la classe MediaType JAX-RS - M. Baron - Page
48
Le type MIME du contenu retourn saccorde par rapport ce qui est support par le client Rponse
HTTP/1.1 200 OK Date: Wed, 05 January 2010 14:44:55 GMT Server: Jetty(6.1.14) Content-Type: text/html
keulkeul.blogspot.com
<html> <title>Details</title> <body> <h1>Ce livre est une introduction sur la vie</h1> </body> </html>
keulkeul.blogspot.com
Gestion du contenu Prcdemment nous sommes focaliss sur les informations contenues dans len-tte dune requte JAX-RS permet galement de manipuler le contenu du corps dune requte et dune rponse JAX-RS peut automatiquement effectuer des oprations de srialisation et d-srialisation vers un type Java spcifique
*/* : byte[] text/* : String text/xml, application/xml, application/*+xml : JAXBElement
keulkeul.blogspot.com
application/x-www-form-urlencoded : MultivalueMap<String,String>
Dans la suite nous montrerons des exemples ct serveur qui illustrent la manipulation des types Java
Dans la partie cliente, nous montrerons comment appeler ces services
JAX-RS - M. Baron - Page 51
keulkeul.blogspot.com
@Path("inputstream") @GET @Produces(MediaType.TEXT_XML) public InputStream getContentBooksWithInputStream() throws FileNotFoundException { return new FileInputStream("c:\\example.xml"); } }
BookResource.java du projet
LibraryContentRestWebService
JAX-RS - M. Baron - Page 52
keulkeul.blogspot.com
BookResource.java du projet
LibraryContentRestWebService
JAX-RS - M. Baron - Page 53
keulkeul.blogspot.com
BookResource.java du projet
LibraryContentRestWebService
JAX-RS - M. Baron - Page 54
Gestion du contenu : types personnaliss Actuellement nous avons employ les types disponibles fournis par Java JAX-RS offre la possibilit dutiliser directement des types personnaliss en sappuyant sur la spcification JAXB JAXB est dfini par la JSR 222 Cest une spcification qui permet de mapper des classes Java en XML et en XML Schema
keulkeul.blogspot.com
Lavantage est de pouvoir manipuler directement des objets Java sans passer par une reprsentation abstraite XML Chaque classe est annote pour dcrire la mapping entre lXML Schema et les informations de la classe
XmlRootElement, XmlElement, XmlType,
JAX-RS - M. Baron - Page 55
Gestion du contenu : types personnaliss JAX-RS supporte la srialisation et la d-srialisation de classes qui sont
annotes par @XmlRootElement, @XmlType enveloppes par un objet JAXBElement
La format du contenu dune requte et dune rponse peut tre reprsent par de lXML ou du JSON Ces formes de contenu sont dfinies par les annotations @Produces et @Consumes peuvent tre
keulkeul.blogspot.com
La manipulation de types personnaliss oblige de prciser dans le service le type MIME traiter et retourner
JAX-RS - M. Baron - Page 56
Gestion du contenu : types personnaliss Exemple : mise jour dun livre (format XML)
@XmlRootElement(name = "book") public class Book { protected String name; protected String isbn; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getIsbn() { return isbn; }
keulkeul.blogspot.com
public void setIsbn(String isbn) { this.isbn = isbn; } public String toString() { return name; } }
Book.java du projet
LibraryContentRestWebService
JAX-RS - M. Baron - Page 57
Gestion du contenu : types personnaliss Exemple (suite) : mise jour dun livre (format XML)
@Path("/contentbooks") public class BookResource { @Path("jaxbxml") @Consumes("application/xml") @PUT public void updateContentBooksWithJAXBXML(Book current) throws IOException { System.out.println("Name: " + current.getName() + ", ISBN: " + current.getIsbn()); } @Path("jaxbxml") @GET @Produces("application/xml") public Book getContentBooksWithJAXBXML() { Book current = new Book(); current.setIsbn("123-456-789"); current.setName("Harry Toper");
Le type MIME retourn par le service ce qui permet au client de connatre le format traiter
keulkeul.blogspot.com
BookResource.java du projet
LibraryContentRestWebService
JAX-RS - M. Baron - Page 58
Gestion du contenu : types personnaliss Exemple : mise jour dun livre (JAXBElement et format XML)
BookResource.java du projet
LibraryContentRestWebService
@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());
keulkeul.blogspot.com
} }
Gestion du contenu : statuts des rponses Lors de lenvoie de la rponse au client un code statut est retourn Rponse sans erreur
Les statuts des rponses sans erreur schelonnent 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
Les statuts des rponses avec erreur schelonnent de 400 599 Une ressource non trouve, le code de retour est 404 Not Found Un type MIME en retour non support, 406 Not Acceptable Une mthode HTTP non supporte, 405 Method Not Allowed
JAX-RS - M. Baron - Page 60
Response Actuellement, tous les services dvelopps retournaient soit un type Void soit un type Java dfini par le dveloppeur JAX-RS facilite la construction de rponses en permettant de
de choisir un code de retour de fournir des paramtres dans len-tte de retourner une URI,
Les rponses complexes sont dfinies par la classe Response disposant de mthodes abstraites non utilisables directement
keulkeul.blogspot.com
Object getEntity() : corps de la rponse int getStatus() : code de retour MultivalueMap<String, Object> getMetaData() : donnes de len-tte
Les informations de ces mthodes sont obtenues par des mthodes statiques retournant des ResponseBuilder Utilisation du patron de conception Builder JAX-RS
- M. Baron - Page 61
ResponseBuilder notModified() : Statut Not Modified ResponseBuilder ok() : Statut Ok ResponseBuilder serverError() : Statut Server Error ResponseBuilder status(Response.Status) : dfini un statut particulier dfini dans Response.Status
keulkeul.blogspot.com
Response Exemple : Prciser code retour et ajouter informations dans len-tte de la rponse BookResource.java du projet
LibraryContentRestWebService
@Path("/contentbooks") public class BookResource { Statut OK ... @Path("response") @GET public Response getBooks() { return Response Trois paramtres .status(Response.Status.OK) .header("param1", "Bonjour") .header("param2", "Hello") .header("server", "keulkeul") .entity("Ceci est le message du coprs de la rponse") .build(); } }
keulkeul.blogspot.com
BookResource.java du projet
LibraryContentRestWebService
keulkeul.blogspot.com
Retour du message Internal Server Error gnr par le serveur lors dune erreur 500
JAX-RS - M. Baron - Page 64
Response Exemple : Retourner une URI lors de la cration dune ressource BookResource.java du projet
LibraryContentRestWebService
@Path("/contentbooks") public class BookResource { ... @Consumes("application/xml") @POST @Path("response") public Response createBooks(Book newBook, @Context UriInfo uri) { URI absolutePath = uri.getAbsolutePath(); return Response.created(absolutePath).build(); } }
keulkeul.blogspot.com
UriBuilder La classe utilitaire UriBuilder permet de construire des URIs complexes Possibilit de construire des URIs avec UriBuilder via
UriInfo (voir @Context) o toutes URIs seront relatives au chemin
de la requte From scratch qui permet de construire une nouvelle URI
UriBuilder Le principe dutilisation de la classe utilitaire UriBuilder est identique ResponseBuilder Les principales mthodes
URI build(Object values) : construit une URI partir dune liste de
valeurs pour les Template Parameters
UriBuilder path(String path) : ajout un chemin de requte UriBuilder fromUri(String uri) : nouvelle instance partir dune URI
UriBuilder host(String host) : modifie lURI de lhte
JAX-RS - M. Baron - Page 67
UriBuilder Exemple : Construire une URI partir de la requte et la retourner lors de la cration dune ressource
BookResource.java du projet
LibraryContentRestWebService
keulkeul.blogspot.com
@Path("/contentbooks") public class BookResource { ... @Consumes("application/xml") @POST @Path("uribuilder1") public Response createBooksFromURI(Book newBook, @Context UriInfo uri) { URI absolutePath = uri .getAbsolutePathBuilder() .queryParam("param1", newBook.getName()) .path(newBook.getIsbn()) .build(); return Response.created(absolutePath).build(); } Ajouter un paramtre }
UriBuilder Exemple : Construire une URI et la retourner lors de la cration dune ressource
BookResource.java du projet
LibraryContentRestWebService
keulkeul.blogspot.com
@Path("/contentbooks") public class BookResource { ... @Consumes("application/xml") @POST @Path("uribuilder2") public Response createURIBooks(Book newBook, @Context UriInfo uri) { URI build = UriBuilder .fromUri("http://www.mylocalhost") .path("path1") BookResource.java du projet .path("path2") LibraryContentRestWebService .build(); return Response.created(build).build(); }
Dploiement Les applications JAX-RS sont construites et dployes sous le format dune application Web Java (WAR) La configuration de JAX-RS dclarer les classes ressources dans le fichier de dploiement (web.xml) Deux types de configuration sont autorises
web.xml pointe sur une sous classe dApplication web.xml pointe sur une Servlet fournie par limplmentation JAX-RS
Set<Class> getClasses() : classes des ressources Set<Object> getSingletons() : instances des ressources
Application fournit une implmentation vide, la classe PackageResourceConfig fournit une implmentation complte JAX-RS - M. Baron - Page 70
Dploiement Exemple : Dclaration des classes ressources via la Servlet fournie par limplmentation de JERSEY
Servlet fournie par Jersey pour le traitement des requtes HTTP
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...> <display-name>HelloWorldRestWebService</display-name> <servlet> <servlet-name>HelloWorldServletAdaptor</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>fr.ensma.lisi.helloworldrestwebservice</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>HelloWorldServletAdaptor</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
keulkeul.blogspot.com
web.xml du projet
HelloWorldRestWebService
JAX-RS - M. Baron - Page 71
LibraryRestWebServiceApplication
du projet LibraryRestWebService
keulkeul.blogspot.com
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...> <display-name>HelloWorldRestWebService</display-name> <servlet> <servlet-name>HelloWorldServletAdaptor</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value> fr.ensma.lisi.libraryrestwebservice.LibraryRestWebServiceApplication </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>HelloWorldServletAdaptor</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
web.xml du projet
LibraryRestWebService
JAX-RS - M. Baron - Page 72
Web Service Rest avec Java6 JAX-RS peut tre utilise avec Java 6 (JAR) sans avoir dployer une application Web (WAR) A la diffrence de JAX-WS limplmentation JERSEY ncessite lajout dun serveur WEB en mode embarqu
Grizzly couteur HTTP en NIO
Usages
Fournir des Services Web une application type client lourd
keulkeul.blogspot.com
Le dveloppement des services Web reste identique Lappel des services Web (client) ne ncessite pas de configuration particulire
JAX-RS - M. Baron - Page 73
Web Service Rest avec Java6 Exemple : Utiliser JAX-RS avec Java 6
@Path("/hello") public class HelloWorldResource { @GET @Produces("text/plain") public String getHelloWorld() { return "Hello World from text/plain"; } }
HelloWorldResource.java du projet
HelloWorldRestWebServiceFromJavaSE
public class HelloWorldRestWebServiceApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<Class<?>>(); classes.add(HelloWorldResource.class); return classes; } }
keulkeul.blogspot.com
HelloWorldRestWebServiceApplication.java du projet
HelloWorldRestWebServiceFromJavaSE
JAX-RS - M. Baron - Page 74
Web Service Rest avec Java6 Exemple (suite) : Utiliser JAX-RS avec Java 6
public class HelloWorldResourceTest { protected SelectorThread st; @After public void tearDown() { if (st != null) st.stopEndpoint(); } @Test public void testDoGetWithApplication() throws ... { Application app = new HelloWorldRestWebServiceApplication();
Cration dune instance de la sous classe Application Cration dun point dentre pour accder aux classes ressources
RuntimeDelegate rd = RuntimeDelegate.getInstance(); Adapter a = rd.createEndpoint(app, Adapter.class); st = GrizzlyServerFactory.create(UriBuilder.fromUri("http://127.0.0.1:8084/").build(), a); ... // Partie cliente, dtaille dans la suite }
keulkeul.blogspot.com
HelloWorldResourceTest.java du projet
HelloWorldRestWebServiceFromJavaSE
JAX-RS - M. Baron - Page 75
Dveloppement Client La spcification JAX-RS ne sintresse pas fournir une API pour le traitement ct client A voir du ct des implmentations JAX-RS si une API cliente est fournie ou pas (JERSEY en propose une) Possibilit galement dutiliser des bibliothques spcialises dans lenvoi et la rception de requtes HTTP Lutilisation de lAPI cliente ne suppose pas que les services
keulkeul.blogspot.com
Web soient dvelopps avec JAX-RS (.NET, PHP, ) Les avantages dutiliser lAPI cliente de JERSEY
Manipuler les types Java (pas de transformation explicite en XML) Facilite lcriture des tests unitaires
JAX-RS - M. Baron - Page 76
Configuration du client
c.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true);
Ou
c.setFollowRedirects(true);
Ou
ClientConfig cc = new DefaultClientConfig(); cc.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true); Client c = Client.create(cc); keulkeul.blogspot.com
Dveloppement Client : la cration de la requte La cration de la requte sappuie sur la patron Builder Cration dune chane dappel de mthodes dont le type de retour est WebResource ou WebResource.Builder La chane dappel se termine par les mthodes correspondant aux mthodes HTTP (GET, POST, ) La classe WebResource.Builder contient les mthodes de terminaison
<T> get(Class<T> c) : appelle mthode GET avec un type de retour T
keulkeul.blogspot.com
Dveloppement Client : la cration de la requte La classe WebResource fournit des mthodes pour construire len-tte de la requte Principales mthodes de WebResource
WebResource path(String) : dfinition dun chemin WebResource queryParam(String key, String val) : paramtre requte Builder accept(MediaType) : type support par le client Builder header(String name, Object value) : paramtre en-tte
keulkeul.blogspot.com
keulkeul.blogspot.com
BookResourceIntegrationTest.java du projet
LibraryRestWebService
JAX-RS - M. Baron - Page 80
keulkeul.blogspot.com
BookResourceIntegrationTest.java du projet
LibraryContentRestWebService
JAX-RS - M. Baron - Page 81
keulkeul.blogspot.com
BookResourceIntegrationTest.java du projet
LibraryContentRestWebService
JAX-RS - M. Baron - Page 82
Outils : Environnements de dveloppement / Outils Tous les environnements de dveloppement de la plateforme Java supportent JAX-RS
Eclipse Netbeans IntelliJ IDEA
Tous ces outils fournissent des assistants, des diteurs XML et des connecteurs pour serveurs dapplication
keulkeul.blogspot.com
Possibilit dutiliser Maven pour faciliter lintgration continue des projets JAX-RS Tous les serveurs dapplication sont supports (Tomcat, JETYY, Glassfish, )
JAX-RS - M. Baron - Page 83
MessageBodyReader et MessageBodyWriter
Intgration de JAX-RS avec les EJBs
keulkeul.blogspot.com