SlideShare une entreprise Scribd logo
1  sur  37
Télécharger pour lire hors ligne
ATELIER TECHNIQUE #3 
Service WEB de type REST en Java 
23 septembre 2014 
François ANDRE 
SEDOO 
OMP
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
SOMAIRE 
1. REST 
2. Mise en oeuvre de Jersey 
3. Test Unitaires 
4. Exemples 
5. Liens 
6. Questions 
2
REST
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
SERVICES WEB 
I Objectif : mise à disposition de services applicatifs en utilisant 
l’infrastructure de Web. 
I Standards 
SOAP 
REST 
4
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
REST 
I Architecture basée sur 
Identification des ressources distribuées par une URL 
Exemple : 
http://portailrbvws.sedoo.fr/rest/Integration/getById/08451ee9-5286-4715-9ab9-91834b24ab5c 
Utilisation des commandes du protocole HTTP - GET, POST, PUT, 
DELETE - pour manipuler ces ressources 
REST CRUD 
POST CREATE 
GET READ 
PUT UPDATE 
DELETE DELETE 
5
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
REST 
I Raisons du succès 
Simplicité de mise en oeuvre 
Simplicité d’intégration dans les clients Web. 
Mécanisme simple de communication entre applications (Web, 
Shell,...) 
I Limites 
Limites des protocoles Web : Same Origin Policy (SOP), Sécurité 
6
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
DANS LE MONDE JAVA 
I JAX-RS (Java API for RESTful Services) - (JSR 311) 
I Implémentation de référence: Jersey 
Version : 2.12 
Contributeur : Oracle 
Licence : Open-source 
7
MISE EN OEUVRE DE JERSEY
PREMIERS PAS
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Premiers pas 
GÉNÉRATION SQUELETTE APPLICATIF 
Utilisation archetype Maven 
mvn archetype:generate -DgroupId=fr.sedoo.demo -DartifactId=atelier3 
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false 
Dépendances (pom.xml) 
... 
<dependencies> 
<dependency> 
<groupId>com.sun.jersey</groupId> 
<artifactId>jersey-server</artifactId> 
<version>1.18</version> 
</dependency> 
</dependencies> 
... 
10
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Premiers pas 
CONFIGURATION WEB 
Ajout de la servlet Jersey (web.xml) 
... 
<servlet> 
<servlet-name>jersey-serlvet</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.sedoo.demo.atelier3.service</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>jersey-serlvet</servlet-name> 
<url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 
... 11
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Premiers pas 
PREMIER SERVICE REST 
package fr.sedoo.demo.atelier3.service; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.Response; 
@Path("/first") 
public class SecondService { 
@GET 
@Path("/isalive") 
public Response getMsg() { 
String output = "Yes"; 
return Response.status(200).entity(output).build(); 
} 
} 
12
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Premiers pas 
RESULTAT 
Remarques : 
I L’annotation @Path n’est pas obligatoire sur une méthode 
I Le chemin peut être une expression régulière : 
@Path("/a:[iI]ntegration") 
I Un service REST retourne un code HTTP et non une exception : 
200, 400, 401, 500 - plus rarement 418... 
13
PASSAGE DE PARAMÈTRES
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Passage de param`etres 
PARAMÈTRES DE CHEMIN : @PATHPARAM 
@GET 
@Path("/iagos/{airport}/{particle}/") 
public Response getUserHistory( 
@PathParam("airport") String airport, 
@PathParam("particle") String particle) 
{ 
return Response.status(200) 
.entity("Voici la teneur en "+particle+" pour "+airport).build(); 
} 
I Url correspondante : http://localhost:7080/atelier3/rest/first/iagos/BLAGNAC/NO2 
I Remarques : 
L’annotation @PathParam peut référencer une partie du chemin de la classe 
Le type de la variable correspondant peut être : 
• Un type primitif (String, int...) 
• Une classe ayant un constructeur ou une méthode statique valueOf ou 
fromString prenant une chaine comme argument 
• Des PathSegment pour une analyse plus fine de l’url. 15
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Passage de param`etres 
PARAMÈTRES DE REQUÊTE : @QUERYPARAM 
@GET 
@Path("/iagos/{airport}/{particle}/") 
public Response getAirportInfo( 
@PathParam("airport") String airport, 
@PathParam("particle") String particle, 
@QueryParam("from") String from, 
@QueryParam("to") String to) 
{ 
return Response.status(200).entity("Voici la teneur en "+particle+ 
"pour "+airport+" de "+from +" a "+ to).build(); 
} 
I Url correspondante : 
http://localhost:7080/atelier3/rest/first/i-agos/ 
BLAGNAC/NO2?from=22/01/2014&to=25/03/2015 
16
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Passage de param`etres 
PARAMÈTRES DE REQUÊTE : @QUERYPARAM 
I Remarques : 
L’utilisation de valeurs par défaut est possible : 
@DefaultValue("2") @QueryParam("step") int step 
Le type de la variable correspondant à @QueryParam peut être : 
• Un type primitif (String, int...) 
• Une classe ayant un constructeur ou une méthode statique valueOf 
ou fromString prenant une chaine comme argument 
• Des listes de ces éléments (répétition du paramètre dans l’URL) 
17
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Passage de param`etres 
PARAMÈTRES DE FORMULAIRE : @FORMPARAM 
@POST 
@Path("/addOrUpdateWithId") 
@Consumes("application/x-www-form-urlencoded") 
public Response addOrUpdateWithId( 
@FormParam("src") String src, 
@FormParam("format") String format, 
@FormParam("login") String login, 
@FormParam("password") String password) 
{ 
... 
} 
Remarques : sur le même principe, il existe aussi 
I @CookieParam : valeur stockée dans un cookie. 
I @HeaderParam : valeur passée dans le header. 
I ... 
18
TYPES RETOURNÉS
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Types retourn´es 
TYPES RETOURNÉS : @PRODUCES 
Il est possible de spécifier une type de retour (Type MIME). 
I Par défaut : text/plain 
I Autres types 
XML : @Produces("application/xml") 
PDF : @Produces("application/pdf") 
Image : @Produces("image/*") 
... 
@GET 
@Path("/getPdfById/{localeCode}/{uuid}") 
@Produces("application/pdf") 
public Response getPdfById(@PathParam("localeCode") String localeCode, ...) 
{ 
... 
} 
20
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Types retourn´es 
TYPES RETOURNÉS : @PRODUCES 
Exemple de retour de fichier 
return Response.ok( 
new ByteArrayInputStream(FileUtils.readFileToByteArray(tmpFile))) 
.build(); 
21
POINTS DIVERS
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Points divers 
WEB APPLICATION DESCRIPTION LANGUAGE (WADL) 
URL du WADL (généré automatiquement) 
http://localhost:7080/atelier3/rest/application.wadl 
23
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Points divers 
AUTHENTIFICATION 
I L’authentification peut être mise en place au moyen de filtres 
Paramètre supplémentaire dans la servlet Jersey 
(web.xml) 
... 
<init-param> 
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
<param-value>fr.sedoo.demo.atelier3.service.AuthFilter</param-value> 
</init-param> 
.. 
I Plusieurs schémas d’authentification sont utilisables : 
HTTP Basic authentication, 
Oauth2, 
... 
24
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
Points divers 
AUTHENTIFICATION 
Filtre d'authentification (AuthFilter.java) 
... 
@Provider 
public class AuthFilter implements ContainerRequestFilter 
{ 
/** 
* Exemple de filtre de sécurité (HTTP Basic Authentication) 
* Si la requête contient le mot "secured" seuls les logins contenant "good" sont acceptés. 
*/ 
public ContainerRequest filter(ContainerRequest request) 
{ 
if (request.getRequestUri().toString().contains("secured")) { 
String auth = request.getHeaderValue("Authorization"); 
//Pas d’authentification 
if (auth == null) { 
throw new WebApplicationException(Status.UNAUTHORIZED); 
}e 
lse { 
String credential = new String(Base64.decodeBase64(auth.getBytes())); 
if (credential.contains("good")) { 
return request; 
}e 
lse { 
throw new WebApplicationException(Status.UNAUTHORIZED); 
} 
} 
} 
else { 
return request; 
} 
} 
}. 
. 
25
TEST UNITAIRES
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
DÉPENDANCES SUPPLÉMENTAIRES 
Dépendances (pom.xml) 
... 
<dependency> 
<groupId>junit</groupId> 
<artifactId>junit</artifactId> 
<version>4.11</version> 
<scope>test</scope> 
</dependency> 
<dependency> 
<groupId>com.sun.jersey</groupId> 
<artifactId>jersey-client</artifactId> 
<version>1.18</version> 
<scope>test</scope> 
</dependency> 
<dependency> 
<groupId>com.sun.jersey</groupId> 
<artifactId>jersey-grizzly2</artifactId> 
<version>1.18</version> 
<scope>test</scope> 
</dependency> 
... 
27
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
PREMIER TEST UNITAIRE 
Jersey-client 
... 
@Test 
public void testGetAirportInfo() 
{ 
Client client = Client.create(); 
String url = 
"http://localhost:7080/atelier3/rest/first/iagos/BLAGNAC/NO2?from=22/01/2014&to=25/03/2015"; 
WebResource webResource = client.resource(url); 
ClientResponse response = webResource.accept("text/plain").get(ClientResponse.class); 
Assert.assertTrue("Le code réponse doit être 200",response.getStatus() == 200); 
String output = response.getEntity(String.class); 
Assert.assertTrue("La réponse doit contenir BLAGNAC", output.contains("BLAGNAC")); 
} 
... 
I L’exécution du test nécessite le lancement du serveur au 
préalable 
28
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
SERVEUR EMBARQUÉ 
Lancement/Arrêt du serveur par le test 
... 
final static URI baseUri = UriBuilder.fromUri( "http://localhost/").port( 7080 ).build(); 
final static String restPath = "rest/"; 
HttpServer server; 
@Before 
public void startServer() throws IOException{ 
ResourceConfig rc = new PackagesResourceConfig("fr.sedoo.demo.atelier3.service"); 
server = GrizzlyServerFactory.createHttpServer(baseUri + restPath, rc); 
} 
@After 
public void stopServer() { 
server.stop(); 
} 
... 
29
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
SERVEUR EMBARQUÉ 
Code du test modifié 
... 
@Test 
public void testGetAirportInfo() 
{ 
Client client = Client.create(); 
String airportName = "BLAGNAC"; 
String url = 
baseUri.toString()+restPath+"first/iagos/"+airportName+"/NO2?from=22/01/2014&to=25/03/2015"; 
WebResource webResource = client.resource(url); 
ClientResponse response = webResource.accept("text/plain").get(ClientResponse.class); 
Assert.assertTrue("Le code réponse doit être "+HttpStatus.OK_200, 
response.getStatus() == HttpStatus.OK_200.getStatusCode()); 
String output = response.getEntity(String.class); 
Assert.assertTrue("La réponse doit contenir "+airportName, output.contains(airportName)); 
} 
... 
30
EXEMPLES
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
PORTAIL RBV 
32
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
PORTAIL RBV - WS 
33
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
PORTAIL RESIF 
34
LIENS
Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions 
LIENS 
I Références 
Thèse de R. Fielding : http://opikanoba.org/tr/fielding/rest/ 
Site officiel Jersey : https://jersey.java.net/ 
I Tutoriels 
http://www.mkyong.com/tutorials/jax-rs-tutorials/ 
http://draptik.github.io/blog/2013/07/19/unit-testing-restful-services/ 
36
QUESTIONS

Contenu connexe

Tendances

Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JSAntoine Rey
 
Cours services web_fabrice_mourlin
Cours services web_fabrice_mourlinCours services web_fabrice_mourlin
Cours services web_fabrice_mourlinangeeLee
 
Tp2 - WS avec JAXRS
Tp2 - WS avec JAXRSTp2 - WS avec JAXRS
Tp2 - WS avec JAXRSLilia Sfaxi
 
Tp3 - Application SOA avec BPEL
Tp3 - Application SOA avec BPELTp3 - Application SOA avec BPEL
Tp3 - Application SOA avec BPELLilia Sfaxi
 
Tp1 - WS avec JAXWS
Tp1 - WS avec JAXWSTp1 - WS avec JAXWS
Tp1 - WS avec JAXWSLilia Sfaxi
 
Ajax (Asynchronous JavaScript and XML)
Ajax (Asynchronous JavaScript and XML)Ajax (Asynchronous JavaScript and XML)
Ajax (Asynchronous JavaScript and XML)Abdelouahed Abdou
 
Rencontre mensuelle Montreal - juillet 2012 - kerberos
Rencontre mensuelle Montreal - juillet 2012 - kerberosRencontre mensuelle Montreal - juillet 2012 - kerberos
Rencontre mensuelle Montreal - juillet 2012 - kerberosNicolas Georgeault
 
comment realiser un Service Web
comment realiser un Service Web comment realiser un Service Web
comment realiser un Service Web Nazih Heni
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 

Tendances (20)

Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
 
Presentation SOAP
 Presentation SOAP Presentation SOAP
Presentation SOAP
 
Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JS
 
Jsp
JspJsp
Jsp
 
Soap
SoapSoap
Soap
 
Cours services web_fabrice_mourlin
Cours services web_fabrice_mourlinCours services web_fabrice_mourlin
Cours services web_fabrice_mourlin
 
Soap, wsdl et uddi
Soap, wsdl et uddiSoap, wsdl et uddi
Soap, wsdl et uddi
 
Cours php
Cours php Cours php
Cours php
 
Tp2 - WS avec JAXRS
Tp2 - WS avec JAXRSTp2 - WS avec JAXRS
Tp2 - WS avec JAXRS
 
Tp3 - Application SOA avec BPEL
Tp3 - Application SOA avec BPELTp3 - Application SOA avec BPEL
Tp3 - Application SOA avec BPEL
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Tp1 - WS avec JAXWS
Tp1 - WS avec JAXWSTp1 - WS avec JAXWS
Tp1 - WS avec JAXWS
 
Ajax (Asynchronous JavaScript and XML)
Ajax (Asynchronous JavaScript and XML)Ajax (Asynchronous JavaScript and XML)
Ajax (Asynchronous JavaScript and XML)
 
Rencontre mensuelle Montreal - juillet 2012 - kerberos
Rencontre mensuelle Montreal - juillet 2012 - kerberosRencontre mensuelle Montreal - juillet 2012 - kerberos
Rencontre mensuelle Montreal - juillet 2012 - kerberos
 
comment realiser un Service Web
comment realiser un Service Web comment realiser un Service Web
comment realiser un Service Web
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)
 

En vedette

Cas d'utilisation de la citation de données
Cas d'utilisation de la citation de donnéesCas d'utilisation de la citation de données
Cas d'utilisation de la citation de donnéesFrancois ANDRE
 
Recommandations rda sur la citation des données
Recommandations rda sur la citation des donnéesRecommandations rda sur la citation des données
Recommandations rda sur la citation des donnéesFrancois ANDRE
 
Panorama citation des donnees
Panorama citation des donneesPanorama citation des donnees
Panorama citation des donneesFrancois ANDRE
 
Présentation normes OGC
Présentation normes OGCPrésentation normes OGC
Présentation normes OGCFrancois ANDRE
 
Introduction aux web components
Introduction aux web componentsIntroduction aux web components
Introduction aux web componentsFrancois ANDRE
 
Paul valery et les Web components
Paul valery et les Web componentsPaul valery et les Web components
Paul valery et les Web componentsFrancois ANDRE
 
Introduction aux web services
Introduction aux web servicesIntroduction aux web services
Introduction aux web servicesmohammed addoumi
 
API : l'architecture REST
API : l'architecture RESTAPI : l'architecture REST
API : l'architecture RESTFadel Chafai
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Ippon
 

En vedette (16)

Cas d'utilisation de la citation de données
Cas d'utilisation de la citation de donnéesCas d'utilisation de la citation de données
Cas d'utilisation de la citation de données
 
Recommandations rda sur la citation des données
Recommandations rda sur la citation des donnéesRecommandations rda sur la citation des données
Recommandations rda sur la citation des données
 
TP GWT JDEV 2015
TP GWT JDEV 2015TP GWT JDEV 2015
TP GWT JDEV 2015
 
Panorama citation des donnees
Panorama citation des donneesPanorama citation des donnees
Panorama citation des donnees
 
Présentation normes OGC
Présentation normes OGCPrésentation normes OGC
Présentation normes OGC
 
Introduction aux web components
Introduction aux web componentsIntroduction aux web components
Introduction aux web components
 
Formation gwt
Formation gwtFormation gwt
Formation gwt
 
Paul valery et les Web components
Paul valery et les Web componentsPaul valery et les Web components
Paul valery et les Web components
 
Introduction aux web services
Introduction aux web servicesIntroduction aux web services
Introduction aux web services
 
HTTP et REST
HTTP et RESTHTTP et REST
HTTP et REST
 
Tutoriel GIT
Tutoriel GITTutoriel GIT
Tutoriel GIT
 
Mixing Python and Java
Mixing Python and JavaMixing Python and Java
Mixing Python and Java
 
API : l'architecture REST
API : l'architecture RESTAPI : l'architecture REST
API : l'architecture REST
 
Web services SOAP et REST
Web services  SOAP et RESTWeb services  SOAP et REST
Web services SOAP et REST
 
Ter Web Service Intro
Ter Web Service IntroTer Web Service Intro
Ter Web Service Intro
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014
 

Similaire à Service WEB de type REST avec Java

Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend FrameworkMickael Perraud
 
Web dev open door
Web dev   open doorWeb dev   open door
Web dev open doorLeTesteur
 
Java EE _ Servlet et vue (1).pdf
Java EE _ Servlet et vue (1).pdfJava EE _ Servlet et vue (1).pdf
Java EE _ Servlet et vue (1).pdfColombieColombie
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
Les tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet coreLes tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet coreArnaud Auroux
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
 
BordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets JavaBordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets JavaCamblor Frédéric
 
ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - CoursENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - CoursHoracio Gonzalez
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Sylvain Wallez
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...fdussert
 
Sécurité et Quaité de code PHP
Sécurité et Quaité de code PHPSécurité et Quaité de code PHP
Sécurité et Quaité de code PHPJean-Marie Renouard
 
PréSentation Qualoo Le Generateur De Code Java J2 Ee
PréSentation Qualoo   Le Generateur De Code Java J2 EePréSentation Qualoo   Le Generateur De Code Java J2 Ee
PréSentation Qualoo Le Generateur De Code Java J2 EeST informatique services
 
Java dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASJava dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASGuillaume Sauthier
 

Similaire à Service WEB de type REST avec Java (20)

Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend Framework
 
Web dev open door
Web dev   open doorWeb dev   open door
Web dev open door
 
Introduction à Symfony
Introduction à SymfonyIntroduction à Symfony
Introduction à Symfony
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Java EE _ Servlet et vue (1).pdf
Java EE _ Servlet et vue (1).pdfJava EE _ Servlet et vue (1).pdf
Java EE _ Servlet et vue (1).pdf
 
Introduction à Laravel
Introduction à LaravelIntroduction à Laravel
Introduction à Laravel
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Les tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet coreLes tests comportementaux avec aspnet core
Les tests comportementaux avec aspnet core
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
Struts
StrutsStruts
Struts
 
BordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets JavaBordeauxJUG : Portails &amp; Portlets Java
BordeauxJUG : Portails &amp; Portlets Java
 
Rapport tp3 j2ee
Rapport tp3 j2eeRapport tp3 j2ee
Rapport tp3 j2ee
 
spring.pdf
spring.pdfspring.pdf
spring.pdf
 
ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - CoursENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
 
Sécurité et Quaité de code PHP
Sécurité et Quaité de code PHPSécurité et Quaité de code PHP
Sécurité et Quaité de code PHP
 
PréSentation Qualoo Le Generateur De Code Java J2 Ee
PréSentation Qualoo   Le Generateur De Code Java J2 EePréSentation Qualoo   Le Generateur De Code Java J2 Ee
PréSentation Qualoo Le Generateur De Code Java J2 Ee
 
Java dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASJava dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnAS
 

Service WEB de type REST avec Java

  • 1. ATELIER TECHNIQUE #3 Service WEB de type REST en Java 23 septembre 2014 François ANDRE SEDOO OMP
  • 2. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions SOMAIRE 1. REST 2. Mise en oeuvre de Jersey 3. Test Unitaires 4. Exemples 5. Liens 6. Questions 2
  • 4. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions SERVICES WEB I Objectif : mise à disposition de services applicatifs en utilisant l’infrastructure de Web. I Standards SOAP REST 4
  • 5. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions REST I Architecture basée sur Identification des ressources distribuées par une URL Exemple : http://portailrbvws.sedoo.fr/rest/Integration/getById/08451ee9-5286-4715-9ab9-91834b24ab5c Utilisation des commandes du protocole HTTP - GET, POST, PUT, DELETE - pour manipuler ces ressources REST CRUD POST CREATE GET READ PUT UPDATE DELETE DELETE 5
  • 6. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions REST I Raisons du succès Simplicité de mise en oeuvre Simplicité d’intégration dans les clients Web. Mécanisme simple de communication entre applications (Web, Shell,...) I Limites Limites des protocoles Web : Same Origin Policy (SOP), Sécurité 6
  • 7. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions DANS LE MONDE JAVA I JAX-RS (Java API for RESTful Services) - (JSR 311) I Implémentation de référence: Jersey Version : 2.12 Contributeur : Oracle Licence : Open-source 7
  • 8. MISE EN OEUVRE DE JERSEY
  • 10. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Premiers pas GÉNÉRATION SQUELETTE APPLICATIF Utilisation archetype Maven mvn archetype:generate -DgroupId=fr.sedoo.demo -DartifactId=atelier3 -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false Dépendances (pom.xml) ... <dependencies> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>1.18</version> </dependency> </dependencies> ... 10
  • 11. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Premiers pas CONFIGURATION WEB Ajout de la servlet Jersey (web.xml) ... <servlet> <servlet-name>jersey-serlvet</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.sedoo.demo.atelier3.service</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey-serlvet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> ... 11
  • 12. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Premiers pas PREMIER SERVICE REST package fr.sedoo.demo.atelier3.service; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Response; @Path("/first") public class SecondService { @GET @Path("/isalive") public Response getMsg() { String output = "Yes"; return Response.status(200).entity(output).build(); } } 12
  • 13. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Premiers pas RESULTAT Remarques : I L’annotation @Path n’est pas obligatoire sur une méthode I Le chemin peut être une expression régulière : @Path("/a:[iI]ntegration") I Un service REST retourne un code HTTP et non une exception : 200, 400, 401, 500 - plus rarement 418... 13
  • 15. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Passage de param`etres PARAMÈTRES DE CHEMIN : @PATHPARAM @GET @Path("/iagos/{airport}/{particle}/") public Response getUserHistory( @PathParam("airport") String airport, @PathParam("particle") String particle) { return Response.status(200) .entity("Voici la teneur en "+particle+" pour "+airport).build(); } I Url correspondante : http://localhost:7080/atelier3/rest/first/iagos/BLAGNAC/NO2 I Remarques : L’annotation @PathParam peut référencer une partie du chemin de la classe Le type de la variable correspondant peut être : • Un type primitif (String, int...) • Une classe ayant un constructeur ou une méthode statique valueOf ou fromString prenant une chaine comme argument • Des PathSegment pour une analyse plus fine de l’url. 15
  • 16. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Passage de param`etres PARAMÈTRES DE REQUÊTE : @QUERYPARAM @GET @Path("/iagos/{airport}/{particle}/") public Response getAirportInfo( @PathParam("airport") String airport, @PathParam("particle") String particle, @QueryParam("from") String from, @QueryParam("to") String to) { return Response.status(200).entity("Voici la teneur en "+particle+ "pour "+airport+" de "+from +" a "+ to).build(); } I Url correspondante : http://localhost:7080/atelier3/rest/first/i-agos/ BLAGNAC/NO2?from=22/01/2014&to=25/03/2015 16
  • 17. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Passage de param`etres PARAMÈTRES DE REQUÊTE : @QUERYPARAM I Remarques : L’utilisation de valeurs par défaut est possible : @DefaultValue("2") @QueryParam("step") int step Le type de la variable correspondant à @QueryParam peut être : • Un type primitif (String, int...) • Une classe ayant un constructeur ou une méthode statique valueOf ou fromString prenant une chaine comme argument • Des listes de ces éléments (répétition du paramètre dans l’URL) 17
  • 18. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Passage de param`etres PARAMÈTRES DE FORMULAIRE : @FORMPARAM @POST @Path("/addOrUpdateWithId") @Consumes("application/x-www-form-urlencoded") public Response addOrUpdateWithId( @FormParam("src") String src, @FormParam("format") String format, @FormParam("login") String login, @FormParam("password") String password) { ... } Remarques : sur le même principe, il existe aussi I @CookieParam : valeur stockée dans un cookie. I @HeaderParam : valeur passée dans le header. I ... 18
  • 20. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Types retourn´es TYPES RETOURNÉS : @PRODUCES Il est possible de spécifier une type de retour (Type MIME). I Par défaut : text/plain I Autres types XML : @Produces("application/xml") PDF : @Produces("application/pdf") Image : @Produces("image/*") ... @GET @Path("/getPdfById/{localeCode}/{uuid}") @Produces("application/pdf") public Response getPdfById(@PathParam("localeCode") String localeCode, ...) { ... } 20
  • 21. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Types retourn´es TYPES RETOURNÉS : @PRODUCES Exemple de retour de fichier return Response.ok( new ByteArrayInputStream(FileUtils.readFileToByteArray(tmpFile))) .build(); 21
  • 23. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Points divers WEB APPLICATION DESCRIPTION LANGUAGE (WADL) URL du WADL (généré automatiquement) http://localhost:7080/atelier3/rest/application.wadl 23
  • 24. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Points divers AUTHENTIFICATION I L’authentification peut être mise en place au moyen de filtres Paramètre supplémentaire dans la servlet Jersey (web.xml) ... <init-param> <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> <param-value>fr.sedoo.demo.atelier3.service.AuthFilter</param-value> </init-param> .. I Plusieurs schémas d’authentification sont utilisables : HTTP Basic authentication, Oauth2, ... 24
  • 25. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions Points divers AUTHENTIFICATION Filtre d'authentification (AuthFilter.java) ... @Provider public class AuthFilter implements ContainerRequestFilter { /** * Exemple de filtre de sécurité (HTTP Basic Authentication) * Si la requête contient le mot "secured" seuls les logins contenant "good" sont acceptés. */ public ContainerRequest filter(ContainerRequest request) { if (request.getRequestUri().toString().contains("secured")) { String auth = request.getHeaderValue("Authorization"); //Pas d’authentification if (auth == null) { throw new WebApplicationException(Status.UNAUTHORIZED); }e lse { String credential = new String(Base64.decodeBase64(auth.getBytes())); if (credential.contains("good")) { return request; }e lse { throw new WebApplicationException(Status.UNAUTHORIZED); } } } else { return request; } } }. . 25
  • 27. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions DÉPENDANCES SUPPLÉMENTAIRES Dépendances (pom.xml) ... <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.18</version> <scope>test</scope> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-grizzly2</artifactId> <version>1.18</version> <scope>test</scope> </dependency> ... 27
  • 28. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions PREMIER TEST UNITAIRE Jersey-client ... @Test public void testGetAirportInfo() { Client client = Client.create(); String url = "http://localhost:7080/atelier3/rest/first/iagos/BLAGNAC/NO2?from=22/01/2014&to=25/03/2015"; WebResource webResource = client.resource(url); ClientResponse response = webResource.accept("text/plain").get(ClientResponse.class); Assert.assertTrue("Le code réponse doit être 200",response.getStatus() == 200); String output = response.getEntity(String.class); Assert.assertTrue("La réponse doit contenir BLAGNAC", output.contains("BLAGNAC")); } ... I L’exécution du test nécessite le lancement du serveur au préalable 28
  • 29. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions SERVEUR EMBARQUÉ Lancement/Arrêt du serveur par le test ... final static URI baseUri = UriBuilder.fromUri( "http://localhost/").port( 7080 ).build(); final static String restPath = "rest/"; HttpServer server; @Before public void startServer() throws IOException{ ResourceConfig rc = new PackagesResourceConfig("fr.sedoo.demo.atelier3.service"); server = GrizzlyServerFactory.createHttpServer(baseUri + restPath, rc); } @After public void stopServer() { server.stop(); } ... 29
  • 30. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions SERVEUR EMBARQUÉ Code du test modifié ... @Test public void testGetAirportInfo() { Client client = Client.create(); String airportName = "BLAGNAC"; String url = baseUri.toString()+restPath+"first/iagos/"+airportName+"/NO2?from=22/01/2014&to=25/03/2015"; WebResource webResource = client.resource(url); ClientResponse response = webResource.accept("text/plain").get(ClientResponse.class); Assert.assertTrue("Le code réponse doit être "+HttpStatus.OK_200, response.getStatus() == HttpStatus.OK_200.getStatusCode()); String output = response.getEntity(String.class); Assert.assertTrue("La réponse doit contenir "+airportName, output.contains(airportName)); } ... 30
  • 32. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions PORTAIL RBV 32
  • 33. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions PORTAIL RBV - WS 33
  • 34. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions PORTAIL RESIF 34
  • 35. LIENS
  • 36. Sommaire REST Mise en oeuvre de Jersey Test Unitaires Exemples Liens Questions LIENS I Références Thèse de R. Fielding : http://opikanoba.org/tr/fielding/rest/ Site officiel Jersey : https://jersey.java.net/ I Tutoriels http://www.mkyong.com/tutorials/jax-rs-tutorials/ http://draptik.github.io/blog/2013/07/19/unit-testing-restful-services/ 36