SOAP Concepts Application à Glassfish LicencePro 2014 Olivier Perrin Université de Lorraine
Évolution From server-side app to smart clients and services 2 Browser-based HTML Rendering (progressive enhancement) Browser Client HTML HTTP View Generation Controllers Application Server Service Layer Channels Repositories RDBMS CRUD Server Re-distribution allowed with author s consent. 15
Évolution From server-side app to smart clients and services 3 HTML5 & JS Engine DOM Controllers Client-side model Browser app or embedded in native web stg Client JSON events & notifications HTTP & WebSockets Service Layer Channels Repositories RDBMS CRUD Server Re-distribution allowed with author s consent. 16
Évolution From server-side app to smart clients and services 4 HTML5 & JS Engine DOM Controllers Client-side model Browser app or embedded in native web stg Client JSON events & notifications HTTP & WebSockets Service Service Service Service Layer business / domain services Channels Repositories RDBMS CRUD Server Re-distribution allowed with author s consent. 17
Évolution From server-side app to smart clients and services 5 HTML5 & JS Engine DOM Controllers Client-side model Browser app or embedded in native web stg Client JSON events & notifications HTTP & WebSockets Service Service Service business / domain services Channels Repositories RDBMS CRUD Server Re-distribution allowed with author s consent. 18
Évolution From server-side app to smart clients and services 6 HTML5 & JS Engine DOM Controllers Client-side model Browser app or embedded in native web stg Client JSON events & notifications HTTP & WebSockets Service Service Service Service Service Service SQL NoSQL other business / domain services platform services, web APIs PaaS Re-distribution allowed with author s consent. 19
Les services Web 7 Les services Web doivent permettre de construire une plateforme distribuée pour le Web Mais, ce n est pas nouveau! CORBA RMI.NET
Besoins 8 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
Micro-services 9 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
Appel de procédure 10 Mécanisme des langages impératifs Dé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 programmeur Langage de définition d interface commun et indépendant du langage de programmation
Services Web 11 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)
WS stack [Colan2002 - IBM] 12 WSBPEL, WSCI, BPML Procédés Fiabilité des messages Sécurité Transactions Coordination Qualité de service WSDL, UDDI, WS-Inspection Description SOAP XML, encodage Autres protocoles Messages HTTP, SMTP, Jabber, Transport
SOAP: historique 13 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
SOAP: introduction 14 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 messages Il est indépendant d un modèle particulier de programmation En gros, c est un protocole pour échanger des informations en envoyant des messages
SOAP: introduction (cont.) 15 L encodage des messages est en XML utilisation de XML Schema utilisation intensive des Namespaces Un objectif majeur: l interopérabilité & les firewalls SOAP est plus simple à implanter qu un équivalent en DCOM ou CORBA Deux utilisations possibles de SOAP RPC: appel de procédures distantes Message: échange de documents XML: EDI (messages)
SOAP: introduction (cont.) 16 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
SOAP: introduction (cont.) 17 Plusieurs bindings pour transporter un message HTTP: le plus courant SMTP Jabber traverse bien les firewalls sur le port 80 (contrairement à RMI par exemple) les messages peuvent être soit le texte du mail, soit un attachement
Concepts de base 18 Un message SOAP est un document XML qui contient les éléments suivants: Enveloppe SOAP Header SOAP Bloc Header Bloc Header Body SOAP Bloc Body - - - Bloc Body
Concepts de base (cont.) 19 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.) 20 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
Exemple de message 21 Voyage Enveloppe SOAP Header SOAP Bloc Header: réservation Bloc Header: passager Body SOAP Bloc sous-élément: itinéraire Bloc sous-élément: hôtel
SOAP: Envelope 22 Le message en entier est contenu dans l élément Envelope L enveloppe ne contient qu un seul élément Body qui est obligatoire L élément Body peut contenir autant de nœuds enfants que nécessaire Le contenu de l élément Body forme le message Si une enveloppe contient un élément Header (un seul, optionnel), ce doit être le premier fils de l élément Envelope
SOAP: Envelope (cont.) 23 Les contenus du Header et du Body dépendent de l application encodingstyle permet d indiquer comment les données vont être sérialisées/désérialisées
SOAP: Header 24 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édiaires l attribut role next: le bloc doit être traité par l intermédiaire suivant none: pas de traitement du bloc ultimatereceiver: le bloc doit être traité par le dernier receveur du message chaque 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: Header (cont.) 25 <?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: Body 26 Le Body est supposé être traité par le dernier service récepteur Hypothèse implicite: le récepteur comprend le message La spécification ne dit rien sur les éléments du Body d un message
SOAP: Body (cont.) 27 <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: Fault 28 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: Fault (cont.) 29 Le schéma soap-envelope définit: VersionMismatch MustUnderstand DataEncodingUnknown Sender Receiver
SOAP: Fault (cont.) 30 <?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: sérialisation 31 La spécification SOAP fournit une méthode pour sérialiser les données Pour envoyer du XML, on l envoie tel quel Une valeur représente soit une donnée unique, soit une composition Un accesseur représente un élément qui donne accès à la valeur <nom>toto</nom> nom est l accesseur, Toto la valeur
SOAP: avec ou sans SOAP? 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 header cela 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 SOAP, message ou RPC? 33 SOAP n est pas limité à à des échanges basés sur des documents On peut utiliser un modèle de RPC avec appels basés sur XML Exemple: reservationservice.gere(paiementreservation) reservationservice.reserve(reservation res,!!!! CarteCredit cc)
SOAP: application à Glassfish
metro: architecture 35 Tooling - NetBeans IDE Security Reliability Transactions Metadata WSDL MEX Policy SOAP based messaging Message encoding (XML, FI) HTTP TCP SMTP
metro: JAX-WS 36 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, transport Inté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)
metro: gestion des attachements BLOB en XML est coûteux Envoi d un BLOB comme un attachement SOAP Méthode par défaut JVM 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() 011011101 011011 byte[] JVM Data handler Fichier temp byte[] 37 Fichier
SOAP: un exemple 38 Étapes Installation de Glassfish (4.0) Installation de Metro (2.2) Écrire un service Web Déploiement du service Écrire un client
Écrire un service Web 39 Simple! package licencepro; import javax.jws.webmethod; import javax.jws.webparam; import javax.jws.webservice; @WebService public class HelloWS { @WebMethod(operationName = "affichehello") public String affichehello(@webparam(name = "nom") String nom) { return "Hello " + nom; } }
Déploiement 40 Se fait grâce aux fichiers web.xml <?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>
Déploiement (cont.) 41 sun-jaxws.xml <?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> Compilation et déploiement en utilisant le fichier build.xml fourni ant server
Le client 42 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); } Compilation ant client
Exécution 43 Dans /build/classes java licencepro.helloclient.helloclient Toto
SOAP Monitor 44 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
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); }
SOAP Monitor (cont.) 46
Synthèse SOAP 47 Un message SOAP doit être encodé en XML Un message SOAP doit utiliser le namespace Envelope de la spécification Un message SOAP doit utiliser le namespace Encoding de la spécification Un message SOAP ne doit pas contenir de DTD Un 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 (cont.) 48 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 service pas de fiabilité pas de sécurité résolus avec WSIT/Tango! 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 résolus avec metro!
SOAP: exercices 49 Hello Calculatrice Traduction Musixtore WS