Académique Documents
Professionnel Documents
Culture Documents
3
Problèmes de SOAP
4
Problèmes de
I-
I
SOAP
Les inconvéniants
SOAP utilise seulement XML
- pour échanger des messages
- pour consommer le SW, il faut le WSDL qui est un document XML
Au niveau du transport du message XML, il prend de l'espace (le fait que
XML est verbaux) et
Au niveau de son chargement en mémoire, il demande de ressource
(mémoire lors du parsage du message côté client)
5
Problèmes de SOAP
Le protocole SOAP a ignoré plusieurs choses dans le header de HTTP, il s'est limité
à utiliser seulement le corps de la requête pour envoyer l'information sous forme de
message XML. La requête SOAP est une requête HTTP dont le corps contient un
message XML. Ce dernier est constitué du nom de l'opération a exécuté et les
paramètres de l'opération.
L'idée principale pour répondre à ces inconvénients : comment utiliser une
simple requête http pour consommer un WS ?
6
REST
II -
II
(REpresentational
State Transfer)
ou RESTful
A. Principe
REST
n'est pas un protocole, mais c'est un norme proposé par Roy Fielding en
2000 dans une thèse de doctorat.
utilise les spécifications originelles du protocole HTTP, plutôt que de
réinventer une surcouche (comme le font SOAP ou XML-RPC par exemple).
est un style d'architecture pour les systèmes hypermédia distribués,
permet de construire des applications (Web, Intranet, Web Service).
REST VS SOAP
Il s'agit d'un ensemble de conventions et de bonnes pratiques à respecter et
non d'une technologie à part entière comme le cas du XML.
SOAP n'est pas obligatoirement un Http ( SOAP c'est un message XML
transporter par un protocole HTTP ou autre protocole) et RESTful c'est du
HTTP, pour cela c'est une norme qui respecte 5 règles
B. LE PROTOCOLE HTTP
1. Définition
7
REST (REpresentational State Transfer) ou RESTful
Une requête HTTP peut être envoyée en utilisant les méthodes suivantes:
GET : Pour récupérer le contenu d'un document
POST : Pour soumissionner des formulaires (Envoyer, dans la requête, des
données saisies par l'utilisateur )
PUT pour envoyer un fichier du client vers le serveur
DELETE permet de demander au serveur de supprimer un document.
HEAD permet de récupérer les informations sur un document (Type,
Capacité, Date de dernière modification etc...)
Requête HTTP
De quoi est constitué la réponse HTTP?
1. header
- la date
- le serveur
- la version
- la date de la dernière modification
2. coprs de la réponse : le résultat retouné
Remarque
Le protocole SOAP ignore ce qui est fournit par HTTP tel que le header. SOPA
repose seuelemnt sur le corps de la requête pour faire passer le message XML.
En plus ce message XML peut être transporté par autre protocole tel que FTP
Règle n°1 :
l'URI (Uniforme ressource Identifier) comme identifiant des ressources
Règle n°2 :
les verbes HTTP comme identifiant des opérations
Règle n°3 :
les réponses HTTP comme représentation des ressources
Ces trois règles sont des normes à respecter
Règle n°4 :
8
REST (REpresentational State Transfer) ou RESTful
1. Règle n°1 :
REST se base sur les URI (Uniform Resource Identifier) afin d'identifier une
ressource.
Une application se doit de construire ses URI (et donc ses URL) de manière précise,
en tenant compte des contraintes REST.
Il est nécessaire de prendre en compte la hiérarchie des ressources et la
sémantique des URL pour les éditer.
2. Règle n°2 :
9
REST (REpresentational State Transfer) ou RESTful
partiel)
DELETE pour supprimer
3. Règle n°3 :
Remarque
Depuis la version HTTP 1.0, le Header s'appel Accept qui permet au client de
spécifier le type MIME qu'il accepte (exp. JPEG, txt, XML, etc.) c.à.d de spécifier la
forme de la ressource que le client attend
4. Règle n°4 :
10
REST (REpresentational State Transfer) ou RESTful
auteur(s), l'éditeur
1 <?xml>
2 <search>
3 <link rel="self" title="self" href="http://mywebsite.com/books?
q=policier&page=1&c=5" />
4 <link rel="next" title="next" href="http://mywebsite.com/books?
q=policier&page=2&c=5" />
5 <link rel="last" title="last" href="http://mywebsite.com/books?
q=policier&page=4&c=5" />
6 <book>
7 //...
8 </book>
9
10 </search>
Complément
Ainsi l'IANA donne une liste de relation parmi lesquelles :
- contents
- edit
- next
- last
- payment
- etc.
La liste complète sur le site de l'IANA :
http://www.iana.org/assignments/link-relations/link-relations.xml
5. Règle n°5 :
StateFul vs Stateless
StateFul (avec état): sécurisé les sessions et les coockies (càd la session est géré
par le serveur qui envoie le numéro de la session qui sera enregisté dans une
cookie. A chaque fois qu'on envoi une requête, on envoi une session ID, une fois
11
REST (REpresentational State Transfer) ou RESTful
12
Mise en œuvre de
III -
III
REST
A. JAX-RS : Spécification
Rappel : JAX-WS
Pour mettre en œuvre un SW basé SOAP, on utilise une spécification JAX-WS
JAX-RS : Spécification
est une API comme JAX-WS créée dans JEE
JAX-RS permet de gérer des SW de type REST
Tout API demande une implémentation
Différentes implémentations de la spécification JAX-RS sont disponibles
JERSEY : implémentation de référence fournie par Oracle Site projet :
http://jersey.java.net
CXF : fournie par Apache, la fusion entre XFire et Celtix Site projet :
cxf.apache.org
RESTEasy : fournie par JBoss Site projet : www.jboss.org/resteasy
RESTlet : un des premiers framework implémentant REST pour Java : Site
projet : www.restlet.org
13
Mise en œuvre de REST
B. JAX-RS: fonctionnement
Comme a été mentionné dans le chapitre SW SOAP, le Web service est crée par un
langage de programmation tel que JAVA.
Ce service doit être déployé dans un serveur web qui est représenté par un
webContainer qui repose sur un middelware tel que jersey
Avec JEE, on utilise aussi une spécification tel que le JAX-RS qui est implémenté par
Jersey pour gérer SW-REST
Pour qu'un client invoque une méthode de SW, il envoie seulement une requête
HTTP avec l'une de méthodes GET, POST, etc.
Le container reçoit cette requête. Puis le container la passe à un middelware Jersey
qui implémente JAX-RS, dans le cas de JEE c'est une servlet. Cette requête appel la
méthode, Ensuite il récupère le résultat le middelware. Enfin ce dernier envoie le
résultat au client au format qui dépend de la demande de client (HTML, XML, json)
14
Mise en œuvre de REST
(règle 3)
C. Annotations
15
Mise en œuvre de REST
D. Exemple
Les WS peuvent publier des données et/ou permettre aux clients de modifier les
données métiers, prenant l'exemple d'un service de Bibliothèque
1 package metier;
2
3 import java.io.Serializable;
4
5 import javax.xml.bind.annotation.XmlRootElement;
6
7 //@XmlRootElement(name = "livres")
8 public class Livre implements Serializable {
9 private int id=0;
10 private String titre;
11 private Date datePubli;
12
13 public Livre() {
14
15 }
16
17 public Livre (int id,String titre) {
18 super();
19 this.id = id;
20 this.titre = titre;
21
22 }
23
24 public int getNumLivre() {
25 return id;
26 }
27 public void setNumLivre(int numLivre) {
28 this.id = numLivre;
29 }
30 public String getTitre() {
31 return titre;
32 }
33 public void setTitre(String titre) {
34 this.titre = titre;
35 }
36
37
38 }
16
Mise en œuvre de REST
1 package service;
2
3 import java.util.ArrayList;
4 import java.util.Date;
5 import java.util.List;
6
7 //import metier.*;
8
9
10 //Cette classe qui sert à persister toutes les informations
concernant le service Web
11
12 public class LivreDB {
13
14
15 private static List<Livre> livre = new ArrayList<Livre>();
16 //private static int id = 1;
17
18 static {
19 livre.add(new Livre(1, "SW"));//, new Date()));
20 livre.add(new Livre(2, "SOA"));//, new Date()));
21 }
22
23 public static List<Livre> getLivres() {
24 return livre;
25 }
26
27 }
1 package service;
2
3
4 import javax.ws.rs.DELETE;
5 import javax.ws.rs.GET;
6 import javax.ws.rs.POST;
7 import javax.ws.rs.PUT;
8 import javax.ws.rs.Path;
9 import javax.ws.rs.Produces;
10 import javax.ws.rs.QueryParam;
11 import javax.ws.rs.core.MediaType;
12 import javax.ws.rs.core.Response;
13 import javax.ws.rs.core.Response.Status;
14
15 import java.util.Date;
16
17 import metier.Livre;
18
19 import java.util.Iterator;
20 import java.util.List;
21
22 import javax.websocket.server.PathParam;
23
24
25 @Path("/biblio")
26 //@Produces("application/json")
27 //@Produces("application/xml")
28 public class BiblioService {
29
30 public BiblioService () {
31 }
32
33
34 /**
35 * retourner la liste des livres
17
Mise en œuvre de REST
36 * @return
37 */
38 @Path("/livres")
39
40 @GET // Méthode HTTP utilisée pour déclencher cette méthode
41 @Produces(MediaType.APPLICATION_JSON)
42 public Response getLivres() {
43 System.out.println("getLivres");
44
45 return Response
46 .status(Status.OK)
47 .entity(LivreDB.getLivres())
48 .build();
49 }
50
51 /**
52 *
53 * retourner un livre en fonction de son identifiant fonctionnel
54 */
55
56
57 @GET // Méthode HTTP utilisée pour déclencher cette méthode
58 //@Path("numLivre-{id}") // Chemin suivant ce template numLivre-1
où 1 est une chaine variable
59 @Path("/livres/{id}")
60 @Produces(MediaType.APPLICATION_JSON)
61
62
63 //Exemple http://localhost:8080/ExempleCoursRest2021/livres/2
64
65 public Response getLivre(@PathParam(value="id") int id) {
66 System.out.println("getLivre" + id);
67
68 for (Livre current : LivreDB.getLivres()) {
69 System.out.println(current.getNumLivre());
70 if (id==current.getNumLivre()) {
71 System.out.println(current.getNumLivre());
72 return Response
73 .status(Status.OK)
74 .entity(current)
75 .build();
76 }
77 }
78 return Response
79 .status(Status.NO_CONTENT)
80 .build();
81 }
82
83 /**
84 * une recherche de Livres par critères passés en paramètre de
la requête (titre).
85 * le sous-chemin associé est /search. Noter que le format de
retour des services est du Json.
86 */
87
88 @GET // Méthode HTTP utilisée pour déclencher cette méthode
89 @Path("/livres/search") // Chemin suivant livres/ pour invoquer
cette méthode
90 @Produces(MediaType.APPLICATION_JSON)
91
92
93 // EXEMPLE
http://localhost:13877/ExempleCoursRest2021/biblio/livres/search?
titre=SW
94
95 public Response searchLivresByCriteria(@QueryParam("titre")
String titre) {
96 System.out.println("searchLibresByCriteria");
97
18
Mise en œuvre de REST
114 @Path("/livres")
115 @Produces(MediaType.APPLICATION_JSON)
116 public Livre save(Livre livre) {
117 LivreDB.getLivres().add(livre);
118 return livre;
119 }
120
121
122 @PUT // Méthode HTTP utilisée pour déclencher cette méthode
123 @Path("/livres/{code}")
124 @Produces(MediaType.APPLICATION_JSON)
125 public Livre update(Livre livre, @PathParam(value="code") int id)
{
126 LivreDB.getLivres().add(livre);
127 return livre;
128 }
129
130 @DELETE // Méthode HTTP utilisée pour déclencher cette méthode
131 @Path("/livres/{code}")
132 @Produces(MediaType.APPLICATION_JSON)
133 public boolean delete(@PathParam(value="code") int id) {
134 LivreDB.getLivres().remove(id);
135 return true;
136 }
137
138
139 }
140
19
Mise en œuvre de REST
application.wadl
20
IV - JSON IV
Remarque
SOAP c'est du XML
REST c'est en fonction de la demande du client d'après la règle 3 qui peut
être XML, JSON
Le format demandé pour REST c'est le JSON car il est plus pratique
Définition
JavaScript Object Notation – Notation Objet issue de JavaScript) est un format
léger d'échange de données.
Il est facile à lire ou à écrire pour des humains. Il est aisément analysable
ou générable par des machines.
est un format texte complètement indépendant de tout langage, mais les
conventions qu'il utilise seront familières à tout programmeur habitué aux
langages descendant du C, comme par exemple : C, C++, C#, Java,
JavaScript, Perl, Python et bien d'autres.
Ces propriétés font de JSON un langage d'échange de données idéal.
Structures de JSON
JSON se base sur deux structures :
Une collection de couples nom/valeur.
Divers langages la réifient par un objet, un enregistrement, une structure,
un dictionnaire, une table de hachage, une liste typée ou un tableau
associatif.
Ces structures de données sont universelles. Pratiquement tous les langages de
programmation modernes les proposent sous une forme ou une autre.
En JSON, les structures de données prennent les formes suivantes :
Un objet, qui est un ensemble de couples nom/valeur non ordonnés. Un
objet commence par { (accolade gauche) et se termine par } (accolade
droite). Chaque nom est suivi de : (deuxpoints) et les couples nom/valeur
sont séparés par , (virgule).
21
JSON
par [ (crochet gauche) et se termine par ] (crochet droit). Les valeurs sont
séparées par , (virgule).
Une valeur peut être soit une chaîne de caractères entre guillemets, soit un
nombre, soit true ou false ou null, soit un objet soit un tableau. Ces
structures peuvent être imbriquées.
Une chaîne de caractères est une suite de zéro ou plus caractères Unicode,
entre guillemets, et utilisant les échappements avec antislash. Un caractère
est représenté par une chaîne d'un seul caractère.
22