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

Documents pareils