Introduction aux Web Services SOAP et WSDL
Introduction aux Web Services SOAP et WSDL
Mohamed Youssfi
Laboratoire Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA)
ENSET, Université Hassan II Casablanca, Maroc
Email : med@[Link]
Supports de cours : [Link]
Chaîne vidéo : [Link]
Recherche : [Link]
Systèmes Distribués
Document XML
➢ Le fichier XML stocke les données du document sous forme d’un arbre
➢ DTD ( Data Type Definition ) ou Schémas XML définit la structure du fichier XML
➢ La feuille de style définit la mise en forme des données de la feuille xml
Introduction aux web services
Les Web Services sont des composants web basés sur Internet (HTTP ) qui exécutent des tâches
précises et qui respectent un format spécifique (XML).
Ils permettent aux applications de faire appel à des fonctionnalités à distance en simplifiant ainsi
l’échange de données.
Les Web Services permettent aux applications de dialoguer à travers le réseau, indépendamment de
• CORBA (Common Object Request Broker Architecture, de l'OMG) en apportant toutefois une
réponse plus simple, s’appuyant sur des technologies et standards reconnus et maintenant
acceptés de tous.
Architecture de base des Web Services
Entête de la requête
HTTP/1.0 200 OK
Date : Wed, 05Feb02 [Link] GMT
Server : Apache/1.3.24
Mime-Version 1.0
Last-Modified : Wed 02Oct01 [Link]GMT
Content-Type : application/xml
Content-legnth : 4205
*** saut de ligne ***
corps de la réponse
med@[Link]
Concepts fondamentaux des web services
Discover
Register
• WSDL (Web Services Description Language)
• donne la description au format XML des Web Services en précisant les méthodes
pouvant être invoquées, leurs signatures et le point d’accès (URL, port, etc..).
• C’est, en quelque sorte, l’équivalent du langage IDL pour la programmation GET WSDL Serveur HTTP
distribuée CORBA. WSDL
Client Web
Service Invocation Web
• UDDI (Universal Description, Discovery and Integration) Service
• normalise une solution d’annuaire distribué de Web Services, permettant à la fois la SOAP = http+XML
publication et l'exploration (recherche) de Web Services.
• UDDI se comporte lui-même comme un Web service dont les méthodes sont
appelées via le protocole SOAP.
Mise en œuvre des
web services
avec JAX-WS
@WebService(serviceName="BanqueWS")
JAX-WS
public class BanqueService {
@WebMethod(operationName="ConversionEuroToDh")
public double conversion(@WebParam(name="montant")double mt){
return mt*11;
• JAX-WS est la nouvelle appellation de JAX- }
RPC (Java API for XML Based RPC) qui permet @WebMethod
public String test(){ return "Test"; }
de développer très simplement des services
@WebMethod
web en Java. public Compte getCompte(){ return new Compte (1,7000); }
• JAX-WS fournit un ensemble d'annotations @WebMethod
pour mapper la correspondance Java-WSDL. Il public List<Compte> getComptes(){
List<Compte> cptes=new ArrayList<Compte>();
suffit pour cela d'annoter directement les
[Link] (new Compte (1,7000)); return cptes;
classes Java qui vont représenter le service }}
web.
• Dans l'exemple ci-dessous, une classe Java
utilise des annotations JAX-WS qui vont
permettre par la suite de générer le
document WSDL. Le document WSDL est
auto-généré par le serveur d'application au
moment du déploiement :
Application
GET BanqueWS?wsdl
1. Créer un Web service qui permet de : Serveur JawWS 2
Web 3
WSDL
• Convertir un montant de l’auro en DH Browser
BanqueService 1
• Consulter un Compte 4
SoapUI WSDL, SOAP +conversion(double mt):double
• Consulter une Liste de comptes +Compte getCompte()
+List<Compte> getComptes()
2. Déployer le Web service avec un simple Serveur JaxWS Client Java 5 SOAP
Proxy Soap
3. Consulter et analyser le WSDL avec un Browser HTTP
JaxWS Compte
4. Tester les opérations du web service avec un outil Client .Net6 SOAP
-code : int
Proxy Soap JaxB -solde: double
comme SoapUI ou Oxygen
BanqueService
Client +conversion(double mt):double
+Compte getCompte()
+List<Compte> getComptes()
1 6
2 3 4
STUB SOAP Compte
SKELETON
5 -code : int
-solde: double
package ws;
import [Link];
import [Link].*;
@XmlRootElement package ws;
import [Link]; import [Link];
public class Compte {
import [Link].*;
private int code; public class Banque {
public static void main(String[] args) throws Exception {
private float solde;
JAXBContext context=[Link]([Link]);
private Date dateCreation; Marshaller marshaller=[Link]();
[Link](Marshaller.JAXB_FORMATTED_OUTPUT,true);
// Constructeur sans paramètre
Compte cp=new Compte(1,8000,new Date());
// Constructeur avec paramètres [Link](cp,new File("[Link]"));
}}
// Getters et Setters
}
package ws;
import [Link].*;
import [Link].*;
public class Banque2 {
public static void main(String[] args) throws Exception {
JAXBContext jc=[Link]([Link]);
Unmarshaller unmarshaller=[Link]();
Compte cp=(Compte) [Link](new File("[Link]"));
[Link]([Link]()+"-"+[Link]()+"-"+[Link]());
}
}
▸ Pour permettre l'utilisation et la manipulation d'un document XML, JAXB propose de générer un ensemble de classes à partir du schéma
XML du document.
• [Link] : une fabrique qui permet de créer des objets de type Compte.
Quelques annotations JAXB
Annotation Description
Associer une classe ou une énumération à
@XmlRootElement
un élément XML
Associer un espace de nommage à un
@XmlSchema
package
Marquer une entité pour ne pas être
@XmlTransient
mappée dans le document XML
Convertir une propriété en un attribut
@XmlAttribute
dans le document XML
Convertir une propriété en un élément
@XmlElement
dans le document XML
Préciser comment un champ ou une
@XmlAccessorType
propriété est sérialisé
Associer un prefixe d'un espace de
@XmlNs
nommage à un URI
Implémentation du Web Service JaxWS
package ws; package metier;
import [Link].*; import [Link];
import [Link].*; import [Link];
import [Link]; import [Link];
@WebService(serviceName="BanqueWS") @XmlRootElement
public class BanqueService { @XmlAccessorType([Link])
@WebMethod(operationName="ConversionEuroToDh") public class Compte {
public double conversion(@WebParam(name="montant")double mt){ private Long code;
return mt*11; private double solde;
} @XmlTransient
@WebMethod private Date dateCreation;
public Compte getCompte(@WebParam(name="code")Long code){ // Constructeurs
return new Compte (code,7000,new Date()); // Getters et setters
} }
@WebMethod
public List<Compte> getComptes(){
List<Compte> cptes=new ArrayList<Compte>();
[Link] (new Compte (1L,7000,new Date()));
[Link] (new Compte (2L,7000,new Date()));
return cptes;
}}
Simple Serveur JAX WS
import [Link];
import [Link];
public class ServeurJWS {
public static void main(String[] args) {
String url="[Link]
[Link](url, new BanqueService());
[Link](url);
}
}
med@[Link]
Analyser le WSDL
Pour Visualiser le WSDL, vous pouvez utiliser un navigateur web
med@[Link]
Déployer un Web service dans un projet Spring Boot
Web Service
@Component
@WebService
public class BanqueService {
// Opérations du web service
}
Classe de configuration
@Configuration
public class MyConfig {
@Bean
public SimpleJaxWsServiceExporter getJWS() {
SimpleJaxWsServiceExporter exporter=new SimpleJaxWsServiceExporter();
[Link]("[Link]
return exporter;
}
}
Structure du WSDL
med@[Link]
Structure du WSDL
Elément Types
med@[Link]
XML Schema
XML Schema
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:tns="[Link] xmlns:xs="[Link] version="1.0"
targetNamespace="[Link]
<xs:element name="ConversionEuroToDh" type="tns:ConversionEuroToDh"></xs:element>
<xs:element name="ConversionEuroToDhResponse" type="tns:ConversionEuroToDhResponse"/>
<xs:element name="compte" type="tns:compte"></xs:element>
<xs:element name="getCompte" type="tns:getCompte"></xs:element>
<xs:element name="getCompteResponse" type="tns:getCompteResponse"></xs:element>
<xs:element name="getComptes" type="tns:getComptes"></xs:element>
<xs:element name="getComptesResponse" type="tns:getComptesResponse"></xs:element>
<xs:complexType name="ConversionEuroToDh">
<xs:sequence>
<xs:element name="montant" type="xs:double"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ConversionEuroToDhResponse">
<xs:sequence>
<xs:element name="return" type="xs:double"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getCompte">
XML Schema <xs:sequence>
<xs:element name="code" type="xs:long" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getCompteResponse">
<xs:sequence>
<xs:element name="return" type="tns:compte" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="compte">
<xs:sequence>
<xs:element name="code" type="xs:long" minOccurs="0"></xs:element>
<xs:element name="solde" type="xs:double"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getComptes">
<xs:sequence></xs:sequence>
</xs:complexType>
<xs:complexType name="getComptesResponse">
<xs:sequence>
<xs:element name="return" type="tns:compte" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
Elément message
<message name="getCompte">
<part name="parameters" element="tns:getCompte"></part>
</message>
<message name="getCompteResponse">
<part name="parameters" element="tns:getCompteResponse"></part>
</message>
med@[Link]
Elément portType
<portType name="BanqueService">
<operation name="getCompte">
<input wsam:Action="[Link] message="tns:getCompte"></input>
<output wsam:Action="[Link]
message="tns:getCompteResponse"></output>
</operation>
<operation name="getComptes">
<input wsam:Action="[Link] message="tns:getComptes"></input>
<output wsam:Action="[Link]
message="tns:getComptesResponse"></output>
</operation>
<operation name="ConversionEuroToDh">
…..
</operation>
</portType>
med@[Link]
Elément binding
<service name="BanqueWS">
<port name="BanqueServicePort"
binding="tns:BanqueServicePortBinding">
<soap:address location="[Link]
</port>
</service>
med@[Link]
Tester les méthodes du web service avec un
analyseur SOAP : SoapUI
Tester les méthodes du web service avec un
analyseur SOAP : SoapUI
med@[Link]
Tester la méthode conversion
Requête SOAP
<soapenv:Envelope xmlns:soapenv="[Link] xmlns:ws="[Link]
<soapenv:Header/>
<soapenv:Body>
<ws:ConversionEuroToDh>
<montant>60</montant>
</ws:ConversionEuroToDh>
</soapenv:Body>
</soapenv:Envelope>
Réponse SOAP
<S:Envelope xmlns:S="[Link]
<S:Body>
<ns2:ConversionEuroToDhResponse xmlns:ns2="[Link]
<return>660.0</return>
</ns2:ConversionEuroToDhResponse>
</S:Body>
</S:Envelope>
med@[Link]
Tester la méthode getCompte
Requête SOAP
<soapenv:Envelope xmlns:soapenv="[Link] xmlns:ws="[Link]
<soapenv:Header/>
<soapenv:Body>
<ws:getCompte>
<code>2</code>
</ws:getCompte>
</soapenv:Body>
</soapenv:Envelope>
Réponse SOAP
<S:Envelope xmlns:S="[Link]
<S:Body>
<ns2:getCompteResponse xmlns:ns2="[Link]
<return>
<code>2</code>
<solde>7000.0</solde>
</return>
</ns2:getCompteResponse>
</S:Body>
</S:Envelope>
med@[Link]
Tester la méthode getComptes
Requête SOAP
<soapenv:Envelope xmlns:soapenv="[Link] xmlns:ws="[Link]
<soapenv:Header/>
<soapenv:Body>
<ws:getComptes/>
</soapenv:Body>
</soapenv:Envelope>
Réponse SOAP
<S:Envelope xmlns:S="[Link]
<S:Body>
<ns2:getComptesResponse xmlns:ns2="[Link]
<return>
<code>1</code>
<solde>7000.0</solde>
</return>
<return>
<code>2</code>
<solde>7000.0</solde>
</return>
</ns2:getComptesResponse>
</S:Body>
</S:Envelope> med@[Link]
Client Java
med@[Link]
Générer le STUB JaxWS
med@[Link]
Fichiers Générés
med@[Link]
Client Java Serveur
med@[Link]
Architecture
Client SOAP Serveur JAXWS
BanqueService
Client +conversion(double mt):double
+test():String
1 6 3 4
2
STUB SOAP SKELETON
5
1 Le client demande au stub de faire appel à la méthode conversion(12)
BanqueService
Web Container : Tomcat +conversion(double mt):double
+getCompte(int code):Compte
+getComptes():List<Compte>
[Link] 3 4
2
SOAP SKELETON
5
1 HTTP 6
Client HTTP
med@[Link]
Création d’un projet Web Dynamique basé sur Tomcat 7
med@[Link]
Projet Web Dynamique
med@[Link]
Générer un proxy (Stub) pour le web Service
Fichier > Nouveau > Web Service Client
Génération du proxy
Générer le proxy à partir du WSDL
Fichier Générés
<%@page import="[Link]"%>
<%
double montant=0; double resultat=0;
if([Link]("montant")!=null){
montant=[Link]([Link]("montant"));
BanqueServiceProxy service=new BanqueServiceProxy();
resultat=[Link](montant);
}
%>
<html><body>
<form action="[Link]">
Montant :<input type="text" name="montant" value="<%=montant%>">
<input type="submit" value="OK">
</form>
<%=montant %> en Euro est égale à <%=resultat %> en DH
</body></html>
Client SOAP avec .Net
med@[Link]
Générer Le Proxy client Soap
Code C# du client
Serveur
using System;
namespace ClientSOAP
{ Web Service
class Program
{
static void Main(string[] args)
{ Skeleton
[Link] stub =
new [Link]();
[Link]("-------- Conversion ---------");
[Link]([Link](34));
SOAP
[Link]("-------- Consulter un Compte ---------");
[Link] cp = [Link](2L); Stub
[Link]("Solde=" + [Link]);
[Link]("-------- Liste des comptes ---------");
[Link][] cptes = [Link](); Client .Net
for (int i = 0; i < [Link]; i++)
{
[Link](cptes[i].code + "-----" + cptes[i].solde);
}
[Link]();
}
}
}
med@[Link]
Dessiner les composants graphique de l’interface
Serveur
Web Service
Skeleton
SOAP
Stub
Client .Net
Web Service Java et Client PHP
Serveur JAXWS
BanqueService
Serveur Web Apache +conversion(double mt):double
+getCompte(int code):Compte
+getComptes():List<Compte>
[Link] 3 4
2
SOAP SKELETON
5
1 HTTP 6
Client HTTP
med@[Link]
Exemple de Client SOAP PHP
<?php
$client = new SoapClient('[Link]
$param=new stdClass();
$param->montant=23;
$res=$client->__soapCall("conversionEuroDH",array($param));
//var_dump($res);
echo($res->return);
$param2=new stdClass();
$param2->arg0=2;
$res2=$client->__soapCall("getCompte",array($param2));
//var_dump($res2);
echo("Code=".$res2->return->code);
echo("<br/>Solde=".$res2->return->solde);
$res3=$client->__soapCall("getComptes",array());
//var_dump($res3);
echo ("<hr/>");
foreach($res3->return as $cpte){
echo("Code=".$cpte->code);
echo("<br/>Solde=".$cpte->solde);
echo("<br/>");
}
?>
Code PHP
<?php
$montant=0;$resultat=0;
if (isset($_GET['montant'])){
$montant=$_GET['montant'];
$client = new SoapClient('[Link]
$param=new stdClass();
$param->montant=$montant;
$rep=$client->__soapCall("conversionEuroDH",array($param));
$resultat=$rep->return;
}
?>
<html>
<body>
<form action="[Link]">
Montant :<input type="text" name="montant" value="<?php echo($montant)?>">
<input type="submit" value="OK">
</form>
<?php echo($montant)?> en Euro est égale à <?php echo($resultat)?> en DH
</body>
</html>
Un autre exemple Client SOAP PHP
<?php
$mt=0;
if(isset($_POST['action'])){
$action=$_POST['action'];
if($action=="OK"){
$mt=$_POST['montant'];
$client=new SoapClient("[Link]
$param=new stdClass();
$param->montant=$mt;
$rep=$client->__soapCall("conversionEuroToDh",array($param));
$res=$rep->return;
}
elseif($action=="listComptes"){
$client=new SoapClient("[Link]
$res2=$client->__soapCall("getComptes",array());
}
}
?>
Suite de l’exemple du Client SOAP PHP
<html>
<body>
<form method="post" action="[Link]">
Montant:<input type="text" name="montant" value="<?php echo($mt)?>">
<input type="submit" value="OK" name="action">
<input type="submit" value="listComptes" name="action">
</form>
Rsultat:
<?php if (isset($res)){
echo($res);
}
?>
<?php if(isset($res2)){?>
<table border="1" width="80%">
<tr>
<th>CODE</th><th>SOLDE</th>
</tr>
<?php foreach($res2->return as $cp) {?>
<tr>
<td><?php echo($cp->code)?></td>
<td><?php echo($cp->solde)?></td>
</tr>
<?php }?>
</table>
<?php }?>
</body>
</html>
med@[Link]
UDDI
• L'annuaire des services UDDI est un standard pour la publication et la découverte des
informations sur les services Web.
• La spécification UDDI est une initiative lancée par ARIBA, Microsoft et IBM.
• Cette spécification n'est pas gérée par le W3C mais par le groupe OASIS.
Les entreprises publient les descriptions de leurs services Web en UDDI, sous la forme de fichiers
WSDL.
Ainsi, les clients peuvent plus facilement rechercher les services Web dont ils ont besoin en
interrogeant le registre UDDI.
Lorsqu'un client trouve une description de service Web qui lui convient, il télécharge son fichier
WSDL depuis le registre UDDI. Ensuite, à partir des informations inscrites dans le fichier WSDL,
notamment la référence vers le service Web, le client peut invoquer le service Web et lui demande
d'exécuter certaines de ses fonctionnalités.
Le scénario classique d'utilisation de UDDI est illustré ci-dessous. L'entreprise B a publié le service
Web S, et l'entreprise A est client de ce service :
SOAP
Structures de données UDDI
Un registre UDDI se
compose de quatre types
de structures de données,
• le businessEntity,
• Le businessService,
• le bindingTemplate
• et la tModel.
med@[Link]
BusinessEntity (entité d'affaires)
Les « businessEntities » sont en quelque sorte les pages blanches d'un annuaire UDDI.
Elles décrivent les organisations ayant publié des services dans le répertoire.
On y trouve notamment
• le nom de l'organisation,
• ses adresses (physiques et Web),
• des éléments de classification,
• une liste de contacts
• ainsi que d'autres informations.
BusinessService (service d'affaires)
Les « businessServices » sont en quelque sorte les pages jaunes d'un annuaire
UDDI.
Elles décrivent de manière non technique les services proposés par les différentes
organisations.
On y trouve essentiellement
• le nom et la description textuelle des services
• ainsi qu'une référence à l'organisation proposant le service
• et un ou plusieurs « bindingTemplate ».
med@[Link]
BindingTemplate (modèle de rattachement)
• UDDI permet de décrire des services Web utilisant HTTP, mais également des services invoqués par
d'autres moyens (SMTP, FTP...).
• Ils contiennent notamment une description, la définition du point d'accès (une URL) et les éventuels «
tModels » associés.
tModel (index)
• UDDI n'impose aucun format pour ces descriptions qui peuvent être publiées
sous n'importe quelle forme et notamment sous forme de documents textuels
(XHTML, par exemple).
med@[Link]
L'interface UDDI
L'interface UDDI est définie sous forme de documents UDDI et implémentée sous forme de service Web
SOAP.
• Interrogation inquiry : Cette interface permet de rechercher des informations dans un répertoire UDDI.
• Publication : Cette interface permet de publier des informations dans un répertoire UDDI.
• Sécurité : cette interface est utilisée pour obtenir et révoquer les jetons d'authentification nécessaires
pour accéder aux enregistrements protégés dans un annuaire UDDI.
• Contrôle d'accès et propriété custody and ownership transfer: Cette interface permet de transférer la
propriété d'informations (qui est à l'origine attribuée à l'utilisateur ayant publié ces informations) et de
gérer les droits d'accès associés.
Mohamed Youssfi
Laboratoire Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA)
ENSET, Université Hassan II Casablanca, Maroc
Email : med@[Link]
Supports de cours : [Link]
Chaîne vidéo : [Link]
Recherche : [Link]
Problème des Web services SOAP
• Règle n°4 :
• les liens comme relation entre ressources • Ainsi l’IANA donne une liste de relation parmi
• <a href="..." rel="payment" >Effectuer un payement</a>
lesquelles :
• Règle n°5 :
• Un paramètre comme jeton d’authentification : • Contents, edit, next, last, payment, etc.
• Envoyer un jeton d’authentification différent pour chaque requête
• La liste complète sur le site de l’IANA :
• [Link]
relations/[Link]
Les 5 Règles de RESTful
• Règle n°1 :
• C’est un des sujets les plus souvent abordé
l’URI comme identifiant des ressources :
quand on parle de REST : comment
•
• Respecter un standard pour construire les URLs
authentifier une requête ?
• Règle n°2 :
les méthode HTTP comme identifiant des opérations:
• Pour authentifier les requêtes HTTP, il faut
envoyer dans la requête un jeton
•
POST : Pour Ajouter (Create)
d’authentification de la requête
•
• GET : pour consulter (Read)
• PUT : pour mise à jour (Update) ou PATCH pour update partiel
• DELETE : pour supprimer (DELETE) • Le premier Jeton X est obtenu au moment de
• Règle n°3 : l’authentification.
• les réponses HTTP comme représentation des ressources
• Réponses HTTP en différents format (XML, JSON, …) en fonction de la demande du client • Pour chaque requête HTTP, ce jeton X peut
• Règle n°4 : être mélangé avec l’URL de la requête en
• les liens comme relation entre ressources utilisant une opération de hachage.
• <a href="..." rel="payment" >Effectuer un payement</a>
@Path("/banque")
• Le développement de Services Web avec JAX-RS est public class BaqueRestService {
basé sur des POJO (Plain Old Java Object) en utilisant
des annotations spécifiques à JAX-RS @Path("/comptes")
@GET
• Pas description requise dans des fichiers de @Produces(MediaType.APPLICATION_JSON)
configuration public List<Compte> listComptes() {
• Seule la configuration de la Servlet « JAX-RS » est List<Compte> cptes=new ArrayList<>();
requise pour réaliser le pont entre les requetés HTTP et ...
@Path("/comptes/{code}")
• Le développement de Services Web avec JAX-RS est @PUT
basé sur des POJO (Plain Old Java Object) en utilisant @Produces(MediaType.APPLICATION_JSON)
des annotations spécifiques à JAX-RS public Compte update(@PathParam("code")Long code,Compte cp) {
[Link](code);
• Pas description requise dans des fichiers de // .. Mise à jour du compte
configuration [Link]("Mise à jour du compte :"+[Link]());
• Seule la configuration de la Servlet « JAX-RS » est return cp;
requise pour réaliser le pont entre les requetés HTTP et }
<dependency> <plugin>
<groupId>javax</groupId> <groupId>[Link]</groupId>
<artifactId>javaee-web-api</artifactId> <artifactId>tomcat7-maven-plugin</artifactId>
<version>7.0</version> <version>2.2</version>
<scope>provided</scope> <configuration>
</dependency> <port>8080</port>
<dependency> <path>/web-api</path>
<groupId>[Link]</groupId> </configuration>
<artifactId>jersey-server</artifactId> </plugin>
<version>1.19.4</version>
</dependency>
<dependency>
<groupId>[Link]</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.19.4</version>
</dependency>
<dependency>
<groupId>[Link]</groupId>
<artifactId>jersey-json</artifactId>
<version>1.19.4</version>
</dependency>
Déploiement de Jersey : [Link]
@Path("/") @XmlRootElement
public class BanqueRestService { @Data @AllArgsConstructor
static Map<Long,Compte> banque=new HashMap<>();
@GET @Path("/test") @NoArgsConstructor
public String test(){ return "Test Jersey"; } public class Compte {
@GET @Path("/comptes/{code}") private Long id;
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON}) private double solde;
public Compte getCompte(@PathParam(value="code") Long code){ private Date dateCreation;
return [Link](code);
}
}
@GET @Path("/comptes") @Produces(MediaType.APPLICATION_JSON)
public Collection<Compte> listComptes(){
return [Link]();
}
@Path("/comptes") @POST @Produces(MediaType.APPLICATION_JSON)
public Compte save(Compte cp){
if([Link]([Link]())!=null) throw new RuntimeException("Ce compte existe déjà");
[Link](new Date());
[Link]([Link](),cp);
return cp;
}
@Path("/comptes/{code}") @PUT @Produces(MediaType.APPLICATION_JSON)
public Compte update(@PathParam("code") Long code,Compte cp){
[Link](code); [Link]([Link](),cp); return cp;
}
@Path("/comptes/{code}") @DELETE @Produces(MediaType.APPLICATION_JSON)
public Compte delete(@PathParam("code") Long code){
return [Link](code);
}
}
Test du Web service RESTful
Test du Web service RESTful
WADL : Web Application Description
Langage
@Component
@Path("/banque") @Entity @Data
public class BanqueRestService { @AllArgsConstructor
@Autowired @NoArgsConstructor
private CompteRepository compteRepository; public class Compte {
@Id @GeneratedValue
@Path("/comptes") @GET private Long code;
@Produces(MediaType.APPLICATION_JSON) private double solde;
public List<Compte> listComptes() { private Date dateCreation;
return [Link]();
} }
@Path("/comptes/{code}")
@GET @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Compte getCompte(@PathParam(value="code")Long code) {
return [Link](code);
}
@Path("/comptes")
@POST @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Compte save(Compte cp) {
[Link](cp);
return cp;
}
@Path("/comptes/{code}") @PUT @Produces(MediaType.APPLICATION_JSON)
@Configuration public Compte update(@PathParam("code")Long code,Compte cp) {
public class MyConfig { [Link](code); [Link](cp);
@Bean return cp;
public ResourceConfig getJaxRSExporter() { }
ResourceConfig exporter=new ResourceConfig(); @Path("/comptes/{code}") @DELETE @Produces(MediaType.APPLICATION_JSON)
[Link]([Link]); public void delete(@PathParam("code")Long code) {
return exporter; [Link](code);
} }
} }
Web Service Restful avec Spring MVC @RestController
@RequestMapping(value="/banque")
public class BanqueRestServiceRC {
@Autowired
• Spring MVC offre des annotations qui permettent de private CompteRepository compteRepository;
créer facilement des web services Restful, sans avoir @GetMapping("/comptes")
public List<Compte> listComptes() {
besoin d’utiliser JAXRS. return [Link]();
• Les annotations principales suivantes peuvent être }
@GetMapping("/comptes/{code}")
utilisées pour ce fait: public Compte getCompte(@PathVariable(value="code")Long code) {
• @RestController : Pour annoter le web service return [Link](code);
}
• @RequestMapping : Pour associer une requête HTTP quelconque @PostMapping("/comptes")
public Compte save(@RequestBody Compte cp) {
• @GetMapping : Pour associer une requête HTTP de type GET [Link](cp);
• @PostMapping : Pour associer une requête HTTP de type POST return cp;
}
• @PutMapping : Pour associer une requête HTTP de type PUT @PutMapping("/comptes/{code}")
public Compte update(@PathVariable(value="code")Long code,Compte cp) {
• @DeleteMapping : Pour associer une requête HTTP de type
[Link](code);
DELETE [Link](cp);
• @RequestBody : Pour associer le corps de la requête HTTP à un return cp;
}
paramètre d’une méthode du web service
@DeleteMapping("/comptes/{code}")
• @PathVariable : Pour associer un paramètre de path URL un public void delete(@PathVariable(value="code")Long code) {
paramètre d’une méthode du web service [Link](code);
}
• @RequestParam : Pour associer un Query param à un paramètre }
d’une méthode du web service
Web Service Restful avec Spring Data Rest
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
@RepositoryRestResource
public interface CompteRepository extends JpaRepository<Compte, Long> {
}
<dependency>
Client REST Java avec Jersey <groupId>[Link]</groupId>
Client <artifactId>jersey-client</artifactId>
<version>1.19.4</version>
</dependency>
Server
<dependency>
<groupId>[Link]</groupId> Client Java
<artifactId>jersey-json</artifactId>
<version>1.19.4</version> HTTP
</dependency> Jersey Client JSON API REST
Hibernate
http SOAP
JSON WSDL
SGBD
Web Client SoapUI