Cours SOAP 2014 - LORIA · web APIs Re-distribution allowed with author’s consent. 19 From...
Transcript of Cours SOAP 2014 - LORIA · web APIs Re-distribution allowed with author’s consent. 19 From...
Olivier Perrin, Université de Lorraine LicencePro, 2014
SOAP Concepts Application à Glassfish
LicencePro 2014
Olivier Perrin Université de Lorraine
Olivier Perrin, Université de Lorraine LicencePro, 2014
Évolution2
Re-distribution allowed with author’s consent.
15
From server-side app to smart clients and services
Browser-based
HTML Rendering
(progressive enhancement)
HTML HTTP
ApplicationServer
ViewGeneration Controllers
Client
Server
Browser
Service Layer
Channels Repositories RDBMSCRUD
Olivier Perrin, Université de Lorraine LicencePro, 2014
Évolution3
Re-distribution allowed with author’s consent.16
From server-side app to smart clients and services
Client
ServerRDBMSCRUD
HTML5 & JS Engine
ControllersDOM
Client-side model
Service Layer
Channels Repositories
web stg
HTTP &WebSockets
events ¬ificationsJSON
Browser app orembedded in native
Olivier Perrin, Université de Lorraine LicencePro, 2014
Évolution4
Re-distribution allowed with author’s consent.17
From server-side app to smart clients and services
Client
RDBMSCRUD
HTML5 & JS Engine
ControllersDOM
Client-side model
Service Layer
Channels Repositories
web stg
HTTP &WebSockets
events ¬ificationsJSON
Service Service Service
Browser app orembedded in native
Server
business / domain services
Olivier Perrin, Université de Lorraine LicencePro, 2014
Évolution5
Re-distribution allowed with author’s consent.18
From server-side app to smart clients and services
Client
RDBMSCRUD
HTML5 & JS Engine
ControllersDOM
Client-side model
Channels Repositories
web stg
HTTP &WebSockets
events ¬ificationsJSON
Service Service Servicebusiness / domain services
Browser app orembedded in native
Server
Olivier Perrin, Université de Lorraine LicencePro, 2014
Évolution6
platform services,web APIs
Re-distribution allowed with author’s consent.19
From server-side app to smart clients and services
ClientHTML5 & JS Engine
ControllersDOM
Client-side model web stg
HTTP &WebSockets
events ¬ificationsJSON
Service Service Servicebusiness / domain services
Browser app orembedded in native
Service Service Service
SQL NoSQL otherPaaS
Olivier Perrin, Université de Lorraine LicencePro, 2014
Les services Web doivent permettre de construire une plateforme distribuée pour le Web
Mais, ce n’est pas nouveau !‣ CORBA
‣ RMI
‣ .NET
Les services Web7
Olivier Perrin, Université de Lorraine LicencePro, 2014
Objectifs‣ interopérabilité
‣ adoption rapide, ubiquité
‣ liaison dynamique à l’échelle d’Internet (SOA)
‣ support d’environnements ouverts (Web) et plus restreints (entreprise)
Besoins‣ standards
‣ infrastructure raisonnable
‣ intégration «simple» des applications
‣ orientation messages et documents vs API
Besoins8
Olivier Perrin, Université de Lorraine LicencePro, 2014
Micro-services
Couplage faible
Composables
Chaque service fait une seule chose, mais la fait bien
Suffisamment petit pour tenir dans une tête (« If a class is bigger than my head then it is too big »)
Suffisamment petit pour être remplacé (« Rewrite over Maintain », un service qui meurt doit le faire vite et fort)
Multiples versions de services
9
Olivier Perrin, Université de Lorraine LicencePro, 2014
Mécanisme des langages impératifsDéfini par une interface qui spécifie:
‣ le type des résultats retournés
‣ le nom de l’opération
‣ les paramètres de l’opération
‣ ex: string traduire (string msg, integer langue)
Niveau d’abstraction pour cacher la communication au programmeurLangage de définition d’interface commun et indépendant du langage de programmation
Appel de procédure10
Olivier Perrin, Université de Lorraine LicencePro, 2014
Il sont décrits grâce à des fichiers‣ WSDL (Web Service Definition Language)
stockés dans un répertoire/annuaire‣ UDDI (Universal Description, Discovery, and Integration)
et ils communiquent grâce au protocole‣ SOAP (plus d’acronyme)
Services Web11
Olivier Perrin, Université de Lorraine LicencePro, 2014
WS stack [Colan2002 - IBM]12
WSBPEL, WSCI, BPML Procédés
Qualitéde
service
Fiabilité des messages Sécurité
Transactions
Coordination
WSDL, UDDI, WS-Inspection Description
HTTP, SMTP, Jabber,… Transport
MessagesSOAP
XML, encodage
Autresprotocoles
Olivier Perrin, Université de Lorraine LicencePro, 2014
SOAP: historique
Simple Object Access Protocol 1.0‣ pas d’objet‣ plutôt Services-Oriented Architecture Protocol
‣ à partir de 1.2, plus d’acronyme‣ spécifique pour COM et HTTP
SOAP 1.1‣ n’importe quel transport binding (pas limité à HTTP)‣ n’importe quel langage (Java)‣ n’importe quel encodage de données (plug-in)‣ indépendant des vendeurs
SOAP 1.2
13
Olivier Perrin, Université de Lorraine LicencePro, 2014
SOAP: introduction
C’est un protocole pour échanger des informations structurées dans un environnement décentralisé/distribuéIl utilise les technologies XML pour définir un cadre extensible d’échange de messagesIl est indépendant d’un modèle particulier de programmation
En gros, c’est un protocole pour échanger des informations en envoyant des messages
14
Olivier Perrin, Université de Lorraine LicencePro, 2014
SOAP: introduction (cont.)
L’encodage des messages est en XML‣ utilisation de XML Schema
‣ utilisation intensive des Namespaces
Un objectif majeur: l’interopérabilité & les firewallsSOAP est plus simple à implanter qu’un équivalent en DCOM ou CORBADeux utilisations possibles de SOAP
‣ RPC: appel de procédures distantes
‣ Message: échange de documents XML: EDI (messages)
15
Olivier Perrin, Université de Lorraine LicencePro, 2014
SOAP: introduction (cont.)
Message: document style‣ on envoie un message qui contient les données, et uniquement les
données (pas de méthode)
‣ le serveur sait traiter les données et répond avec un message
‣ et ainsi de suite…
‣ c’est du transfert d’informations
RPC: RPC style‣ on envoie les paramètres et les types de retour, et la méthode à
invoquer
‣ SOAP est utilisé comme un système XML-RPC
‣ il traverse mieux les firewalls que RMI par exemple
16
Olivier Perrin, Université de Lorraine LicencePro, 2014
SOAP: introduction (cont.)
Plusieurs bindings pour transporter un message‣ HTTP: le plus courant
traverse bien les firewalls sur le port 80 (contrairement à RMI par exemple)
‣ SMTPles messages peuvent être soit le texte du mail, soit un attachement
‣ Jabber
17
Olivier Perrin, Université de Lorraine LicencePro, 2014
Concepts de base
Un message SOAP est un document XML qui contient les éléments suivants:
18
Enveloppe SOAP
Header SOAP
Bloc Header
Bloc Header
Body SOAP
Bloc Body
Bloc Body
-
-
-
Olivier Perrin, Université de Lorraine LicencePro, 2014
‣ un élément enveloppe (obligatoire) qui identifie le document XML comme étant un message SOAP
qui définit le début et la fin du message
‣ un élément header (optionnel) qui contient des attributs du message
point intermédiaire ou final
‣ un élément body (obligatoire)qui contient toutes les informations de l’appel et de la réponse
données XML
‣ un élément fault (optionnel) qui fournit les informations à propos des erreurs survenues lors du traitement du message
Concepts de base (cont.)19
Olivier Perrin, Université de Lorraine LicencePro, 2014
Tous les éléments sont déclarés dans l’espace de nommage pou l’enveloppe SOAP
‣ http://www.w3.org/2003/5/soap-envelope
et les encodages et données dans‣ http://www.w3.org/2003/5/soap-encoding
Concepts de base (cont.)20
Olivier Perrin, Université de Lorraine LicencePro, 2014
Voyage
Exemple de message21
Enveloppe SOAPHeader SOAP
Body SOAP
Bloc Header: réservation
Bloc Header: passager
Bloc sous-élément:itinéraire
Bloc sous-élément: hôtel
Olivier Perrin, Université de Lorraine LicencePro, 2014
Le message en entier est contenu dans l’élément Envelope
L’enveloppe ne contient qu’un seul élément Body qui est obligatoireL’élément Body peut contenir autant de nœuds enfants que nécessaireLe contenu de l’élément Body forme le messageSi une enveloppe contient un élément Header (un seul, optionnel), ce doit être le premier fils de l’élément Envelope
SOAP: Envelope22
Olivier Perrin, Université de Lorraine LicencePro, 2014
Les contenus du Header et du Body dépendent de l’applicationencodingStyle permet d’indiquer comment les données vont être sérialisées/désérialisées
SOAP: Envelope (cont.)23
Olivier Perrin, Université de Lorraine LicencePro, 2014
Chaque élément du Header est appelé un bloc‣ contient généralement des informations pour traiter le message
‣ les informations peuvent être destinées à des intermédiairesl’attribut role
next: le bloc doit être traité par l’intermédiaire suivantnone: pas de traitement du blocultimateReceiver: le bloc doit être traité par le dernier receveur du messagechaque intermédiaire (application réceptrice) doit vérifier qu’il peut jouer un rôle. Si c’est le cas, il supprime le bloc, sinon, il le passe au suivant
l’attribut mustUnderstand spécifie que l’application doit comprendre ce que le bloc signifie (sinon, erreur)
SOAP: Header24
Olivier Perrin, Université de Lorraine LicencePro, 2014
<?xml version="1.0"?><env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" env:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <env:Header> <m:reservation xmlns:m="http://example.org/reservation" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustUnderstand="true"> <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</reference> <m:dateAndTime>2012-09-29T13:20:00.000-05:00</m:dateAndTime> </m:reservation> <n:passenger xmlns:n="http://mycompany.example.com/employees" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustUnderstand="true"> <n:name>John Q. Public</n:name> </n:passenger> </env:Header>...</env:Envelope>
SOAP: Header (cont.)25
Olivier Perrin, Université de Lorraine LicencePro, 2014
Le Body est supposé être traité par le dernier service récepteurHypothèse implicite: le récepteur comprend le messageLa spécification ne dit rien sur les éléments du Body d’un message
SOAP: Body26
Olivier Perrin, Université de Lorraine LicencePro, 2014
<env:Body><p:itinerary xmlns:p="http://example.org/reservation/travel"> <p:departure> <p:departing>New York</p:departing> <p:arriving>Los Angeles</p:arriving> <p:departureDate>2012-09-14</p:departureDate> <p:departureTime>late afternoon</p:departureTime> <p:seatPreference>aisle</p:seatPreference> </p:departure> <p:return> <p:departing>Los Angeles</p:departing> <p:arriving>New York</p:arriving> <p:departureDate>2012-09-20</p:departureDate> <p:departureTime>mid morning</p:departureTime> <p:seatPreference/> </p:return></p:itinerary> <q:lodging xmlns:q="http://example.org/reservation/hotels"> <q:preference>none</q:preference></q:lodging></env:Body>
SOAP: Body (cont.)27
Olivier Perrin, Université de Lorraine LicencePro, 2014
Toutes les erreurs doivent apparaître dans un élément Fault unique dans le Body
Il contient les sous-éléments suivants‣ Code: le code permettant d’identifier
‣ Reason: explication de l’erreur
‣ Node: l’élément à l’origine de la faute
‣ Role: qui est à l’origine de la faute
‣ Detail: information spécifique sur l’erreur pour l’application
SOAP: Fault28
Olivier Perrin, Université de Lorraine LicencePro, 2014
Le schéma soap-envelope définit:‣ VersionMismatch
‣ MustUnderstand
‣ DataEncodingUnknown
‣ Sender
‣ Receiver
SOAP: Fault (cont.)29
Olivier Perrin, Université de Lorraine LicencePro, 2014
<?xml version="1.0" ?><env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:rpc="http://www.w3.org/2003/05/soap-rpc"> <env:Body> <env:Fault> <env:Code> <env:Value>env:Sender</env:Value> <env:Subcode> <env:Value>rpc:BadArguments</env:Value> </env:Subcode> </env:Code> <env:Reason> <env:Text xml:lang="en-US">Processing error</env:Text> </env:Reason> <env:Detail> <e:myFaultDetails xmlns:e="http://travelcompany.example.org/faults"> <e:message>Name does not match card number</e:message> <e:errorcode>999</e:errorcode> </e:myFaultDetails> </env:Detail> </env:Fault> </env:Body></env:Envelope>
SOAP: Fault (cont.)30
Olivier Perrin, Université de Lorraine LicencePro, 2014
La spécification SOAP fournit une méthode pour sérialiser les donnéesPour envoyer du XML, on l’envoie tel quelUne valeur représente soit une donnée unique, soit une compositionUn accesseur représente un élément qui donne accès à la valeur
‣ <nom>Toto</nom>
‣ nom est l’accesseur, Toto la valeur
SOAP: sérialisation31
Olivier Perrin, Université de Lorraine LicencePro, 2014
32
SOAP apporte ‣ la possibilité d’orchestrer plusieurs services Web
‣ la possibilité d'accéder à un service Web possédant une API
‣ la possibilité d’ajouter des méta-données dans le headercela permet de traiter le message d’une certaine façon, ou de ne pas le traiter (rôle next ou ultimateReceiver)
‣ le fait de ne pas être restreint à des échanges de messages basés sur les documents ou RPC
‣ le fait de simplifier la sérialisation de documents XML complexes
SOAP: avec ou sans SOAP ?
Olivier Perrin, Université de Lorraine LicencePro, 2014
33
SOAP n’est pas limité à à des échanges basés sur des documentsOn peut utiliser un modèle de RPC avec appels basés sur XMLExemple:
‣ reservationService.gere(paiementReservation)
‣ reservationService.reserve(Reservation res,! ! ! ! CarteCredit cc)
SOAP: avec SOAP, message ou RPC ?
Olivier Perrin, Université de Lorraine LicencePro, 2014
SOAP: application à Glassfish
Olivier Perrin, Université de Lorraine LicencePro, 2014
metro: architecture35
Tooling - NetBeans IDE
Security Reliability Transactions MetadataWSDLMEX
PolicySOAP based messaging
Message encoding (XML, FI)
HTTP TCP SMTP
Olivier Perrin, Université de Lorraine LicencePro, 2014
metro: JAX-WS
JAX-WS 2.2: API Web services simple à utiliser ‣ support de Web Services Addressing 1.0
POJO + annotations ‣ programmation facilitée
Indépendance vis-à-vis de encodage, protocole, transportIntégration de JAXB (Java Architecture for XML Binding)
‣ API Java
‣ support100% de XML Schema
Transmission de messages optimisée‣ MTOM/XOP (W3C), FastInfoset (ITU-T/ISO)
36
Olivier Perrin, Université de Lorraine LicencePro, 2014
metro: gestion des attachements
BLOB en XML est coûteuxEnvoi d’un BLOB comme un attachement SOAPMéthode par défaut
‣ utilisation de byte[]‣ besoin de mémoire (tas)
Méthode plus appropriée: utilisation d’un “Data Handler”‣ plus besoin que l’objet réside en mémoire‣ le chargement peut être différé‣ méthodes facilitant la gestion:
InputStream getContent()String getContentType()Object getInputStream()
37
JVM
byte[]
011011101…
JVM
byte[]
011011…
Fichiertemp
Data handlerFichier
Olivier Perrin, Université de Lorraine LicencePro, 2014
38
Étapes‣ Installation de Glassfish (4.0)
‣ Installation de Metro (2.2)
‣ Écrire un service Web
‣ Déploiement du service
‣ Écrire un client
SOAP: un exemple
Olivier Perrin, Université de Lorraine LicencePro, 2014
39
Simple !
package licencepro;
public class HelloWS { @WebMethod(operationName = "afficheHello") public String afficheHello(@WebParam(name = "nom") String nom) { return "Hello " + nom; }}
Écrire un service Web
import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;
@WebService
Olivier Perrin, Université de Lorraine LicencePro, 2014
40
Se fait grâce aux fichiers‣ web.xml
Déploiement
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" ...> <description>licencepro</description> <display-name>Hello</display-name> <listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class> </listener> <servlet> <servlet-name>licencepro</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>licencepro</servlet-name> <url-pattern>/helloservice</url-pattern> </servlet-mapping> <session-config> <session-timeout>60</session-timeout> </session-config></web-app>
Olivier Perrin, Université de Lorraine LicencePro, 2014
Déploiement (cont.)41
‣ sun-jaxws.xml
Compilation et déploiement en utilisant le fichier build.xml fourni
‣ ant server
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'! ! version='2.0'> <endpoint name='licencepro' implementation='licencepro.HelloService' url-pattern='/helloservice'/></endpoints>
Olivier Perrin, Université de Lorraine LicencePro, 2014
42
Le client
Compilation‣ ant client
package licencepro.helloclient;
public class HelloClient { public static void main(String[] args) { try { !! HelloService port = ! ! ! ! new HelloServiceService().getHelloServicePort();
String resAppelService = port.afficheHello(args[0]); System.out.println("Le resultat est: "+ resAppelService); } catch (Exception ex) { System.out.println ("Exception: " + ex); } } }
Olivier Perrin, Université de Lorraine LicencePro, 2014
43
Dans /build/classesjava licencepro.helloclient.HelloClient Toto
Exécution
Olivier Perrin, Université de Lorraine LicencePro, 2014
SOAP Monitor
Pour voir ce qui se passe !‣ le message SOAP de la requête
‣ le message SOAP de la réponse
Comment ?‣ télécharger l’archive sur le site du cours (wsmonitor.zip)
‣ dans le répertoire bin/, lancez wsmonitor.sh (ou wsmonitor.bat)
‣ modifier le code du client pour:passer par le port 4040
utiliser le monitor comme intermédiaire entre le client et le service
forwarder la requête au endpoint
44
Olivier Perrin, Université de Lorraine LicencePro, 2014
SOAP Monitor (cont.)45
package licencepro.helloclient;import javax.xml.ws.BindingProvider;
public class HelloClient { public static void main(String[] args) { try { HelloService port =
! ! new HelloServiceService().getHelloServicePort();
// Modification du port: 4040 au lieu de 8080 BindingProvider bp = (BindingProvider) port; String addresse =! ! ! (String)bp.getRequestContext().! ! ! ! get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY); addresse = addresse.replaceFirst("8080", "4040"); bp.getRequestContext().put(! ! ! BindingProvider.ENDPOINT_ADDRESS_PROPERTY, addresse); String resAppelService = port.afficheHello(args[0]); System.out.println("Le resultat est: "+ resAppelService); } catch (Exception ex) { System.out.println ("Exception: " + ex); } } }
Olivier Perrin, Université de Lorraine LicencePro, 2014
SOAP Monitor (cont.)46
Olivier Perrin, Université de Lorraine LicencePro, 2014
Un message SOAP doit être encodé en XMLUn message SOAP doit utiliser le namespace Envelope de la spécificationUn message SOAP doit utiliser le namespace Encoding de la spécificationUn message SOAP ne doit pas contenir de DTDUn message SOAP contient:
‣ un élément Envelope (obligatoire)‣ un élément Header (optionnel)‣ un élément Body (obligatoire)‣ un élément Fault (optionnel)
Synthèse SOAP 47
Olivier Perrin, Université de Lorraine LicencePro, 2014
Problèmes‣ SOAP est devenu plus un protocole de bas niveau pour implanter
les files de messages plutôt qu’un protocole d’accès à un servicepas de fiabilité
pas de sécurité
pas de transactions
‣ SOAP et les types de données complexes (images, documents,…)attachements (comme avec SMTP), mais MIME n’est pas la panacée
WS-Attachements
‣ pas toujours très simple !
Une alternative: REST
Synthèse SOAP (cont.)48
résolus avec WSIT/Tango !
résolus avec metro !
Olivier Perrin, Université de Lorraine LicencePro, 2014
49
HelloCalculatriceTraductionMusixtore WS
SOAP: exercices