Slides du cours XML-RPC
Transcription
Slides du cours XML-RPC
(( Bienvenu dans le Stringwarec ! )) 2. XML-RPC et SOAP [email protected] LIFL – IRCICA 1 Plan √ √ A. XML-RPC I La spécification XML-RPC I Exemple de mise en œuvre B. SOAP I Le lavage I Le rinçage LIFL – IRCICA c 2002-2006, Raphaël Marvie 2 A. XML-RPC (( XML + RPC = XML-RPC )) [Souhaite rester anonyme] LIFL – IRCICA c 2002-2006, Raphaël Marvie 3 Pourquoi XML-RPC √ √ √ Fournir un support simple de connectivité entre applications I Support à l’appel synchrone de méthodes distantes Etre indépendant des technologies d’exécution I Langages de programmations I Plates-formes d’exécutions Mécanisme de base standard pour transporter des requêtes I Basé sur le langage XML pour l’encodage I Basé sur le protocole HTTP pour le transport LIFL – IRCICA c 2002-2006, Raphaël Marvie 4 Motivations √ Non lié à l’approche orientée objet I Faciliter l’intégration d’un existant hétérogène I Information compréhensible par tout langage de programmation √ XML-RPC comme colle logicielle I Systèmes distribués de plus en plus omniprésents I Intégration de systèmes au travers de procédures simples √ Publication de services sur le web I Connaissance du service et maı̂trise du serveur I Aucune idée quant aux clients potentiels √ Proposé au début 1998 par UserLand Software LIFL – IRCICA c 2002-2006, Raphaël Marvie 5 Vue d’ensemble √ Spécification en trois parties √ XML-RPC Data Model I Ensemble de types pour encoder les requêtes I Paramètres, valeurs de retour et messages d’erreurs √ XML-RPC Request Structures I Requête HTTP POST I Information : nom de méthode et paramètres √ XML-RPC Response Structures I Réponse HTTP I Information : valeur de retour ou message d’erreur LIFL – IRCICA c 2002-2006, Raphaël Marvie 6 B.1. XML-RPC Data Model LIFL – IRCICA c 2002-2006, Raphaël Marvie 7 XML-RPC Data Model √ √ Définit les structures de base des messages réseau I Six types de base • int, double, boolean, string, dateTime.iso8601, base64 I Deux types construits • array, struct Ensemble réduit de structures de données I Dénominateur commun de beaucoup de langages I Suffisant pour représenter nombre d’informations LIFL – IRCICA c 2002-2006, Raphaël Marvie 8 Types de base √ Eléments XML simples contenant les valeurs LIFL – IRCICA Type string int (i4) double boolean dateTime. iso8601 Veleur ASCII text Int 32-bit Float 64-bit true / false dates enc iso8601 base64 Info. binaire enc base 64 Example <string>hello world!</string> <int>27</int> ou <i4>27</i4> <double>3.14159</double> <boolean>1</boolean> <dateTime.iso8601> 20021110T14:57:16 </dateTime.iso8601> <base64>SGVcbG8sIFdvcmxkIQ== </base64> c 2002-2006, Raphaël Marvie 9 Utilisation des types de base √ √ √ Toujours inclu dans un élément <value> I <value><string>hello world !</string></value> I <value><int>12345</int></value> I <value><double>-4.25</double></value> Seul les tags <string> peuvent être omis I <value>Ceci est aussi une chaı̂ne...</value> Peuvent être combinés pour produire des types construits I tableaux I structures LIFL – IRCICA c 2002-2006, Raphaël Marvie 10 Les tableaux √ Objectif I Structuration d’information séquentielle I Structuration récursive possible I Taille non contrainte I Peut contenir des données hétérogènes • types de base et construits √ Utilisation I Contenu dans un <value> I Définition avec le tag <array> I Valeurs définies dans la partie <data> LIFL – IRCICA c 2002-2006, Raphaël Marvie 11 Utilisation des tableaux (i) √ Type de données homogènes <value> <array> <data> <value><int>1</int></value> <value><int>2</int></value> <value><int>3</int></value> </data> </array> </value> LIFL – IRCICA c 2002-2006, Raphaël Marvie 12 Utilisation des tableaux (ii) √ Type de données hétérogènes <value> <array> <data> <value><int>1</int></value> <value><string>poisson</string></value> <value><dateTime.iso8601>20021110T14:57:16 </dateTime.iso8601></value> <value><boolean>1</boolean></value> </data> </array> </value> LIFL – IRCICA c 2002-2006, Raphaël Marvie 13 Utilisation des tableaux (iii) √ Tableau à plusieurs dimensions <value> <array> <data> <value> <array> <data> <value><int>00</int></value> <value><int>01</int></value> </data> </array> </value> LIFL – IRCICA c 2002-2006, Raphaël Marvie 14 Utilisation des tableaux (iii’) <value> <array> <data> <value><int>10</int></value> <value><int>11</int></value> </data> </array> </value> </data> </array> √ </value> C’est un peu verbeux il est vrai. . . LIFL – IRCICA c 2002-2006, Raphaël Marvie 15 Les structures √ Objectif I Définir des listes de paires nom / valeur I Proche des tables de hashage / propriétés I Contient des éléments non ordonnés I Peut contenir tout type de données (de base ou construit) √ Utilisation I Contenu dans un <value> I Définition avec le tag <struct> I Une paire est définie par le tag <member> I Chaque membre contient un <name> et un <value> LIFL – IRCICA c 2002-2006, Raphaël Marvie 16 Utilisation des structures (i) √ Une structure simple à deux entrées <value> <struct> <member> <name>nom</name> <value><string>Raphaël Marvie</string></value> </member> <member> <name>bureau</name> <value><int>328b</int></value> </member> </struct> </value> LIFL – IRCICA c 2002-2006, Raphaël Marvie 17 Utilisation des structures (ii) √ Une structure plus complexe : une fiche d’étudiant(e) I Contient le nom de l’étudiant(e), son année et les modules suivis <value> <struct> <member> <name>nom</name> <value><string>John Doe</string></value> </member> <member> <name>annee</name> <value><int>3</int></value> </member> LIFL – IRCICA c 2002-2006, Raphaël Marvie 18 Utilisation des structures (ii’) <member> <name>modules</name> <value><array> <data> <value><string>COO</string></value> <value><string>CAR</string></value> <value><string>C++</string></value> <value><string>IHM</string></value> </data> </array></value> </member> </struct> </value> LIFL – IRCICA c 2002-2006, Raphaël Marvie 19 B.2. XML-RPC Request Structures LIFL – IRCICA c 2002-2006, Raphaël Marvie 20 Structure des requêtes √ Combinaison d’information XML et de requêtes HTTP I Utilise le modèle de données de XML-RPC • Specifie la procédure appelée et ses arguments I Exploite l’en-tête du protocole HTTP • Encapsule les requêtes sur le réseau √ Une requête == un document XML I Racine du document : <methodCall> • Nom de la procédure : <methodName> • Liste ordonnée des paramètres : <params> • Chaque paramètre identifié par un <param> LIFL – IRCICA c 2002-2006, Raphaël Marvie 21 Exemple de requête XML-RPC (i) √ Invocation d’une procédure de tri d’un tableau d’entiers <?xml version="1.0"?> <methodCall> <methodName>tri</methodName> <params> <param> <value><array><data> <value><int>123</int></value> <value><int>789</int></value> <value><int>456</int></value> </data></array></value> </param> </params> </methodCall> LIFL – IRCICA c 2002-2006, Raphaël Marvie 22 Exemple de requête XML-RPC (ii) √ En-tête HTTP d’une requête POST I Reflète l’émetteur de la requête et le contenu I Précise la librairie XML-RPC et non le programme • myXMLRPCClient I Serveur XML-RPC à l’adresse /xmlrpc POST /xmlrpc HTTP 1.0 User-Agent: myXMLRPCClient/1.0 Host: 134.206.11.23 Content-Type: text/xml Content-Length: 249 LIFL – IRCICA c 2002-2006, Raphaël Marvie 23 B.3. XML-RPC Response Structures LIFL – IRCICA c 2002-2006, Raphaël Marvie 24 Structure des réponses : succès √ Similaire aux requêtes en un peu plus retord √ Si exécution correcte I Document XML avec racine <methodResponse> I Ne contient pas de nom de méthode √ Un seul paramètre I Type simple ou construit I Si procédure sans retour • Une valeur doit quand même refléter le succès → Exemple : un booléen avec la valeur vrai (1) • Tu pousses le bouchon un peu loin Maurice ! LIFL – IRCICA c 2002-2006, Raphaël Marvie 25 Exemple de réponse XML-RPC : succès √ Retour du tableau trié <?xml version="1.0"?> <methodResponse> <params> <param> <value><array><data> <value><int>123</int></value> <value><int>456</int></value> <value><int>789</int></value> </data></array></value> </param> </params> </methodResponse> LIFL – IRCICA c 2002-2006, Raphaël Marvie 26 Structure des réponses : échec √ Si problème dans l’exécution de la procédure I Elément XML <methodResponse> I Contient un élément XML fault • Contient une seule valeur reflétant l’erreur • Codes d’erreurs non standardisés (de niveau applicatif) LIFL – IRCICA c 2002-2006, Raphaël Marvie 27 Exemple de réponse XML-RPC : échec √ C’est flagrant <?xml version="1.0"?> <methodResponse> <params> <param> <value><string>Procédure inconnue: tri</string></value> </param> </params> </methodResponse> LIFL – IRCICA c 2002-2006, Raphaël Marvie 28 En-tête des réponses XML-RPC √ Comme les requêtes, les réponses contiennent un en-tête HTTP I Toutes les réponses ont le code HTTP 200 OK I Précise le serveur HTTP ayant traité la requête I Content-Type toujours de type text/xml I Connexion fermée après chaque réponse I Peut refléter la librairie XML-RPC utilisée HTTP/1.0 200 OK Date: Mon Nov 11 03:15:11 CET 2002 Server: Apache.2.0.1 (Linux) Connection: close Content-Type: text/xml Content-Length: 147 LIFL – IRCICA c 2002-2006, Raphaël Marvie 29 B.4. Mise en œuvre de XML-RPC LIFL – IRCICA c 2002-2006, Raphaël Marvie 30 Développer avec XML-RPC √ √ √ Approche de mise en œuvre I Utilisation d’une librairie XML-RPC I Appels de procédures via la librairie I Ecriture de wrappers pour réutiliser du code Pour essayer de garder la vie simple I N’utiliser que les types supportés par XML-RPC Illustration sur un serveur basique : un convertisseur I Utilisation de la librairie Java XML-RPC du projet Apache LIFL – IRCICA c 2002-2006, Raphaël Marvie 31 Apache, XML-RPC et Java √ √ Support simple à la réalisation d’applications utilisant XML-RPC La librairie XML-RPC Apache offre I Un processus automatisé d’enregistrement des procédures auprès d’un serveur I Un serveur parlant XML-RPC nativement, sans utilisation de servlets I Une librairie cliente simple à utiliser pour faire de l’invocation de procédures distantes √ Librement disponible en ligne I http ://xml.apache.org/xmlrpc/ LIFL – IRCICA c 2002-2006, Raphaël Marvie 32 Mise en œuvre du service √ Classe Java implantant une méthode de conversion I Transforme une valeur en euros vers une valeur en francs package fr.lifl.xmlrpc.exemple ; public class ConvertisseurHandler { public double euro2francs (double valeur) { return valeur * 6.55975 ; } } LIFL – IRCICA c 2002-2006, Raphaël Marvie 33 Mise à disposition du service (i) √ Un serveur doit rendre cette classe accessible via HTTP √ La procédure doit être enregistrée auprès du package XML-RPC package fr.lifl.xmlrpc.exemple ; import org.apache.xmlrpc.WebServer ; public class Server { public static void main (String[] args) { try { (new Server ()).start () ; } catch (java.io.IOException e) { System.out.println (e.getMessage()) ; } } LIFL – IRCICA c 2002-2006, Raphaël Marvie 34 Mise à disposition du service (ii) public void start () throws java.io.IOException { // démarrage du serveur sur le port 12345 WebServer server = new WebServer (12345) ; System.out.println ("Serveur démarré avec succès") ; // enregistrement de la procédure server.addHandler ("convertir", new ConvertisseurHandler ()) ; System.out.println ("Procédure euro2francs enregistrée") ; // y’a plus qu’à... System.out.println ("En attente de requêtes...") ; } } LIFL – IRCICA c 2002-2006, Raphaël Marvie 35 Réalisation d’un client (i) √ Evaluation d’un appel sur la procédure euro2franc package fr.lifl.xmlrpc.exemple ; import org.apache.xmlrpc.XmlRpcClient ; import org.apache.xmlrpc.XmlRpcException ; public class Client { public static void main (String[] args) { if (args.length != 1) { System.out.println ("Usage: " + "java fr.lifl.xmlrpc.exemple.Client valeur") ; System.exit (-1) ; } LIFL – IRCICA c 2002-2006, Raphaël Marvie 36 Réalisation d’un client (ii) Client client = new Client () ; double valeur = Double.parseDouble (args[0]) ; try { double res = client.convertir (valeur) ; System.out.println ("Valeur en Francs: " + res) ; } catch (java.io.IOException e1) { System.out.println ("IOException:" + e1.getMessage()) ; } catch (org.apache.xmlrpc.XmlRpcException e2) { System.out.println ("XmlRpcException:" + e2.getMessage()) ; } } LIFL – IRCICA c 2002-2006, Raphaël Marvie 37 Réalisation d’un client (iii) public convertir (double valeur) throws java.io.IOException, XmlRpcException { XmlRpcClient client = new XmlRpcClient ("http://localhost:12345") ; // création de la requête java.util.Vector params = new java.util.Vector () ; params.addElement (new Double (valeur)) ; // evaluation de la requête et analyse du résultat Object resultat = client.execute ("convertir.euro2francs", params) ; return Double.parseDouble (resultat.toString()) ; } } LIFL – IRCICA c 2002-2006, Raphaël Marvie 38 Réalisation d’un client en Python from xmlrpclib import Server # creation du proxy d’acces au service web server = Server (’http://localhost:12345’) # invocation du service euro2francs (en java) res = server.convertir.euro2francs (12.34) # affichage du resultat print ’12.34 euros =’, res LIFL – IRCICA c 2002-2006, Raphaël Marvie 39 Réalisation d’un serveur en Python from SimpleXMLRPCServer import SimpleXMLRPCServer class convertir: def euro2francs (self, val): return 6.55975 * val class server: def __init__ (self, host=’localhost’, port=8008): self._server = SimpleXMLRPCServer ((host, port)) self._server.register_instance (convertir ()) def run (self): self._server.serve_forever () if __name__ == ’__main__’: s = server () s.run () LIFL – IRCICA c 2002-2006, Raphaël Marvie 40 Requête XML-RPC type de l’exemple POST / HTTP 1.1 Content-Length: 188 Content-Type: text/xml User-Agent: Java1.3.1_01 Host: localhost:12345 Connection: keep-alive <?xml version="1.0" encoding="ISO-8859-1"?> <methodCall><methodName>convertir.euro2franc</methodName> <params> <param><value><double>15.25</double></value></param> </params> </methodCall> LIFL – IRCICA c 2002-2006, Raphaël Marvie 41 Réponse XML-RPC type de l’exemple HTTP/1.0 200 OK Date: Mon Nov 11 03:15:11 CET 2002 Server: Apache/1.3.20 (Linux) Connection: close Content-Type: text/xml Content-Length: 143 <?xml version="1.0" encoding="ISO-8859-1"?> <methodCall> <params> <param><value><double>100.03619</double></value></param> </params> </methodCall> LIFL – IRCICA c 2002-2006, Raphaël Marvie 42 Remarques sur XML-RPC √ XML-RPC est un concept simple... I Approche par plus petit dénominateur commun I Facile à implanter et à rendre interopérable I Permet de faire coopérer des applications hétérogènes √ ...avec un nombre limité de capacités I Approche par plus petit dénominateur commun I Ne supporte pas la gestion des sessions I Répond uniquement à l’appel de procédure (cdç) I Pas de contrat entre client et serveur : aucun contrôle ⇔ Refaire toute son installation électrique avec un couteau suisse :o) LIFL – IRCICA c 2002-2006, Raphaël Marvie 43 B. Simple Object Access Protocol (( Mais c’est bon le savon Joe ! )) [Averell] LIFL – IRCICA c 2002-2006, Raphaël Marvie 44 Motivations √ Evolution du XML-RPC vers le monde objet I Simple Object Access Protocol I Motivations similaires • Indépendance par rapport aux plates-formes et aux langages √ Typer les messages I Identifier les instances et les méthodes I Exploiter la flexibilité des XML schemas √ Protocole indépendant de la couche transport I Peut être mis en œuvre sur tout protocole réseau I Initialement destiné au protocole HTTP LIFL – IRCICA c 2002-2006, Raphaël Marvie 45 La spécification SOAP √ Composée de trois parties √ SOAP envelope specification I Règles d’encapsulation des informations à transmettre I Méthode, paramètres, valeur de retour et codes d’erreurs √ Data encoding rules I Définition des types de données I Basées sur les schémas XML √ RPC conventions I Supporte les messages synchrones et asynchrones I Conventions simples dans le cas synchrone LIFL – IRCICA c 2002-2006, Raphaël Marvie 46 C.1. SOAP Envelope Specification LIFL – IRCICA c 2002-2006, Raphaël Marvie 47 Structure d’un message SOAP √ Utilisé pour : messages asynchrones, requêtes et réponses √ Document XML I Une seule invocation par message I Utilisation de namespaces XML • Eléments structurants : SOAP-ENV √ SOAP Message I Envelope (Required) • Header (Optional) • Body (Required) → Fault (Optional) LIFL – IRCICA c 2002-2006, Raphaël Marvie 48 Enveloppe d’un message : Envelope √ Contenant de l’information du message (Requis) I Elément racine du message : <SOAP-ENV :Envelope> √ Gestion du numéro de version de SOAP I Utilisation d’un namespace XML • SOAP 1.1 http ://schemas.xmlsoap.org/soap/envelope/ • SOAP 1.2 http ://schemas.xmlsoap.org/2001/09/soap-envelope/ I Si namespace invalide : erreur de version <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> ... </SOAP-ENV:Envelope> LIFL – IRCICA c 2002-2006, Raphaël Marvie 49 En-tête d’un message : Header √ Précision d’information spécifique à l’application (Optionel) I Mécanisme ouvert et flexible • authentification, gestion des transactions, etc. • Exemple : signature digitale pour service sécurisé I Peu utilisé actuellement √ Deux attributs sont spécifiés I Actor • Chemin du message (noeuds), destinataire du header I MustUnderstand • Spécifie si un header est optionel ou non • Si requis : header analysé ou levée d’une erreur LIFL – IRCICA c 2002-2006, Raphaël Marvie 50 Exemple de Header √ Précise un compte pour le paiement de l’accès au service I Ce header doit être analysé par le serveur <SOAP-ENV:Header> <ns1:CompteUsager xmlns:ns1="urn:exemplesoap" SOAP-ENV:mustUnderstand="true"> moncomptenumerotéensuissepourleservice </ns1:CompteUsager> </SOAP-ENV:Header> LIFL – IRCICA c 2002-2006, Raphaël Marvie 51 Corps d’un message : Body √ √ √ Contient l’information minimale d’un message (Requis) Requête I Contient le nom de la méthode et ses paramètres I Plusieurs namespaces utilisés pour éviter les conflits Réponse I Un seul élément de réponse contenant la valeur de retour I Utilisation des mêmes namespaces que la requête LIFL – IRCICA c 2002-2006, Raphaël Marvie 52 Exemple de Request (i) <?xml version=’1.0’ encoding=’UTF-8’> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:convertir xmlns:ns1="urn:xmethods-Convertisseur" SOAP-ENV:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/"> <valeur xsi:type="xsd:double">15.25</valeur> </ns1:convertir> </SOAP-ENV:Body> </SOAP-ENV:Envelope> LIFL – IRCICA c 2002-2006, Raphaël Marvie 53 Exemple de Request (ii) √ Remarques sur la requête I Méthode convertir seul élément du corps I Les paramètres : sous-éléments de la méthode √ Utilisation de quatre namespaces XML I Identificateurs de l’enveloppe • http ://schemas.xmlsoap.org/soap/envelope/ I Encodage des données • http ://www.w3.org/2001/XMLSchema-instance • http ://www.w3.org/2001/XMLSchema I Identificateurs spécifiques à XMethods • urn :xmethods-Convertisseur LIFL – IRCICA c 2002-2006, Raphaël Marvie 54 Exemple de Response <?xml version=’1.0’ encoding=’UTF-8’> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:convertirResponse xmlns:ns1="urn:xmethods-Convertisseur" SOAP-ENV:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/"> <return xsi:type="xsd:double">100.03619</return> </ns1:convertirResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> LIFL – IRCICA c 2002-2006, Raphaël Marvie 55 Element d’erreur d’un message :Fault √ √ Dans le cas d’une erreur d’exécution (Optionel) I Elément <SOAP-ENV :Fault> contenue dans le corps Structuration d’une erreur Elément faultCode faultString faultActor detail LIFL – IRCICA Description Code pour indiquer la classe d’erreur Description textuelle pour l’usager Description de la cause de l’erreur Message d’erreur spécifique à l’application c 2002-2006, Raphaël Marvie 56 Classes d’erreurs √ Valeurs possibles pour le tag <faultCode> Nom Description VersionMismatch Namespace de l’enveloppe incorrect MustUnderstand Incapacité de traiter un Header imposé MustUnderstand ne peut être ignoré Client Erreur dans la requête provenant du client comme un nom de méhode incorrect Server Requête imposible à traiter par le serveur utilisé pour tout erreur du côté serveur LIFL – IRCICA c 2002-2006, Raphaël Marvie 57 Exemple de Fault √ Méthode requise par le client non localisable <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultCode xsi:type="xsd:string"> SOAP-ENV:Client </faultCode> <faultString xsi:type="xsd:string"> Failed to locate method (tri) in class (Trieur2Tableau). </faultString> </SOAP-ENV:Fault> </SOAP-ENV:Body> LIFL – IRCICA c 2002-2006, Raphaël Marvie 58 C.2. Data Encoding Rules LIFL – IRCICA c 2002-2006, Raphaël Marvie 59 Encodage des données √ Types de base : une seule valeur I SOAP 1.1 : schéma XML de types propres à SOAP I SOAP 1.2 : repose sur la spécification XML schemas I En général masqués par la librairie SOAP utilisée √ Types construits I Tableaux et structures I Types récursifs √ Type d’encodage spécifié dans l’enveloppe I Positionné par le tag <SOAP-ENV :encodingStyle> I SOAP 1.1 : http ://schemas.xmlsoap.org/soap/encoding/ I SOAP 1.2 : http ://www.w3.org/2001/09/soap-encoding LIFL – IRCICA c 2002-2006, Raphaël Marvie 60 Types de base √ Utilisation des types scalaires des schéma XML I XML Schema Part0 : Primer I string, int, double, boolean, date, time, etc. √ Spécification des types (dépend de l’outil SOAP) I Utilisation de l’attribut xsi :type (Apache) I Utilisation d’un schéma externe (Microsoft) <ns1:convertirResponse xmlns:ns1="urn:xmethods-Convertisseur" SOAP-ENV:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/"> <return xsi:type="xsd:double">100.03619</return> </ns1:convertirResponse> LIFL – IRCICA c 2002-2006, Raphaël Marvie 61 Types construits : les tableaux (i) √ Règles strictes de définition I Spécification du type des éléments I Spécification de la taille du tableau √ Définition d’un tableau I Attribut xsi :type positionné à Array I Attribut arrayType • Reflète le type des éléments et la taille du tableau • arrayType="xsd :double[10]" I Tag item pour chaque élément du tableau • Reprécise le type de l’élément LIFL – IRCICA c 2002-2006, Raphaël Marvie 62 Types construits : les tableaux (ii) √ Exemple de tableau contenant trois entiers I Dans le cas de SOAP les tableaux sont homogènes <return xmlns:ns2="http://www.w3.org/2001/09/soap-encoding" xsi:type="ns2:Array" ns2:arrayType="xsd:int[3]"> <item xsi:type="xsd:int">123</item> <item xsi:type="xsd:int">789</item> <item xsi:type="xsd:int">456</item> </return> LIFL – IRCICA c 2002-2006, Raphaël Marvie 63 Types construits : les structures √ Définition d’une structure I Au travers d’un schéma : définition de son type I Contient des éléments de différents types • Associé à un nom unique et à un type <return xmlns:ns2="urn:exemplesoap" xsi:type="ns2:etudiant"> <name csi:type="xsd:string">John Doe</name> <annee xsi:type="xsd:int">3</annee> <modules xmlns:ns2="http://www.w3.org/2001/09/soap-encoding" xsi:type="ns2:Array" ns2:arrayType="xsd:string[2]"> <item xsi:type="xsd:string">COO</item> <item xsi:type="xsd:string">CAR</item> </modules> </return> LIFL – IRCICA c 2002-2006, Raphaël Marvie 64 Types littérals √ Permet de transférer des documents XML <ns1:ficheEtudiantResponse xmlns:ns1="urn:exemplesoap:XMLScolarite" SOAP-ENV:encodingStyle= "http://xml.apache.org/xml-soap/literalxml"> <return> <name>John Doe</name> <annee>3</annee> <modules> <module name="COO"/> <module name="CAR"/> </modules> </return> </ns1:ficheEtudiantResponse> LIFL – IRCICA c 2002-2006, Raphaël Marvie 65 C.3. Mise en œuvre de SOAP LIFL – IRCICA c 2002-2006, Raphaël Marvie 66 SOAP et HTTP √ √ Seul protocole abordé dans la spécification I Protocole le plus populaire I Projection naturelle SOAP → HTTP • Requête SOAP = requête HTTP (POST majoritairement) • Réponse SOAP = réponse HTTP Particularité SOAP I En-tête HTTP étendue • SOAPAction (optionel en 1.2) • URI specifique au serveur : objectif de la requête LIFL – IRCICA c 2002-2006, Raphaël Marvie 67 Exemple d’en-tête de requête SOAP / HTTP √ Service XMethods offrant le traducteur BabelFish I Service permettant une interaction SOAP avec BabelFish I Service indépendant d’Alta-Vista POST /perl/soaplite.cgi HTTP/1.0 Host: services.xmethods.com Content-type: text/xml; charset=utf-8 Content-length: 538 SOAPAction: "urn:xmethodsBabelFish#BabelFish" <!-- message SOAP de requête --> LIFL – IRCICA c 2002-2006, Raphaël Marvie 68 Exemple d’en-tête de réponse SOAP / HTTP √ Réponse du service XMethods offrant le traducteur BabelFish √ En-tête HTTP reflète le résultat I HTTP 200 OK → Response I HTTP 500 Server Internal Error → Fault HTTP/1.1 200 OK Date: Thu Nov 14 00:24:20 CET 2002 Server: Apache/1.3.20 (Linux) SOAPServer: SOAP::Lite/Perl/0.50 Cache-Control: s-maxage=60, proxy-revalidate Content-Length: 539 Content-Type: text/xml LIFL – IRCICA c 2002-2006, Raphaël Marvie 69 Apache SOAP : (( Hello world ! )) √ √ Ecire des programmes client / server en SOAP I Librairie implantant le protocole SOAP I Un moteur de servlet pour les serveurs (Tomcat Jakarta) Déroulement d’un échange 1. Le client produit une requête SOAP et l’envoie (HTTP POST) 2. Le serveur Tomcat route la requête vers la servlet rpcrouter 3. rpcrouter fait le lookup du service, crée l’objet l’implantant et invoque l’opération appropriée 4. Traitement par l’objet implantant le service 5. rpcrouter reçoit le résultat, encapsule dans une réponse SOAP et retourne la réponse au client. LIFL – IRCICA c 2002-2006, Raphaël Marvie 70 Mise en œuvre du service √ √ Classe Java HelloWorld I Offre une méthode String hello (String name) Totalement indépendant de SOAP I Pas d’utilisation des librairies SOAP public class HelloWorld { public String hello (String name) { return "Hello " + name ; } } LIFL – IRCICA c 2002-2006, Raphaël Marvie 71 Mise en œuvre du client √ Utilisation explicite de la librairie SOAP 1. Création d’un objet Call représentant la requête I Nom du service et de la méthode à invoquer 2. Construction de la liste des paramètres 3. Invocation du service I Crée et envoie la requête, reçoit et interprète la réponse SOAP 4. Contrôle du type de réponse SOAP I Erreur ou ok ? 5. Extraction de la valeur de la réponse SOAP LIFL – IRCICA c 2002-2006, Raphaël Marvie 72 Extraits du code client (i) √ Définition et initialisation de l’objet requête // Création de l’objet requête org.apache.soap.rpc.Call call = new org.apache.soap.rpc.Call () ; // Utilisation de l’encodage standard call.setEncodingStyleURI (org.apache.soap.Constants.NS_URI_SOAP_ENC) ; // Définition de l’uri de l’objet service et de la méthode call.setTargetObjectURI ("urn:examplesoap:helloservice") ; call.setMethodName ("hello") ; LIFL – IRCICA c 2002-2006, Raphaël Marvie 73 Extraits du code client (ii) √ Définition des paramètres et ajout dans la requête // Définition des paramètres org.apache.soap.Parameter param = new org.apache.soap.Parameters ("name", String.class, "raph", Constants.NS_URI_SOAP_ENC) ; // Contruction de la liste des paramètres java.util.Vector params = new java.util.Vector () ; params.addElement (param) ; // Initialisation des paramètres de la requête call.setParams (params) ; LIFL – IRCICA c 2002-2006, Raphaël Marvie 74 Extraits du code client (iii) √ Définition de l’url de destination, invocation et évaluation // Invocation de la requête et analyse de la réponse try { URL url = // url du serveur web new URL ("http://localhost:8080/soap/servlet/rpcrouter") ; org.apache.soap.Response resp = call.invoke (url, "") ; } catch (org.apache.soap.SOAPException e1) { ... } catch (java.net.MalformedURLException e2) { ... } if (!resp.generatedFault ()) { org.apache.soap.Parameter result = resp.getReturnValue () ; System.out.println (result.getValue ()) ; } else {...} LIFL – IRCICA c 2002-2006, Raphaël Marvie 75 Mise en place d’un service √ Déploiement d’un service auprès du serveur Tomcat I Enregistrement d’une classe auprès du serveur √ Utilisation de l’outil ServiceManagerClient I java org.apache.soap.server.ServiceManagerClient (-auth user :passwd) url operation arguments I Operations • list : liste des services SOAP du serveur • deploy <file.xml> : deploie le service décrit dans le fichier • query <servicename> : affiche le descripteur du service • undeploy <servicename> : supprime le service LIFL – IRCICA c 2002-2006, Raphaël Marvie 76 Descripteur de déploiement √ Décrit la classe à déployer et la configuration du service I URN du service et nom de la méthode I Eléments comportementaux <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn:exemplesoap:helloservice" checkMustUnderstand="false"> <isd:provider type="java" scope="Request" methods="hello"> <isd:java class="HelloWorld" static="false"/> </isd:provider> </isd:service> LIFL – IRCICA c 2002-2006, Raphaël Marvie 77 Remarques sur SOAP (+) √ √ √ Proposition plus orientée objet que XML-RPC I En phase avec l’évolution des attentes de l’industrie Représentation des données plus avancées I Manipulation de structures de données typées I Utilisation de schéma XML pour définir des types Manipulation dynamiques des requêtes I Flexibilité d’utilisation I Beaucoup plus rigolo :o) LIFL – IRCICA c 2002-2006, Raphaël Marvie 78 Remarques sur SOAP (-) √ 500 octets de texte pour tranférer un caractère... √ Manipulation dynamiques des requêtes I Auncun contrôle de validité à la compilation I Auncun contrôle de typage √ Problèmes d’interopérabilité entre implantations de SOAP I Choix de représentation des types I Même évolution que des propositions comme CORBA • Ce n’est encore que le début (sic) √ Réinvention de la roue. . .en pierre √ Pourquoi utiliser une string quand on peut avoir un caleçon moletonné ? ;o) LIFL – IRCICA c 2002-2006, Raphaël Marvie