LES WEB SERVICES AUTEUR : ALBERT RITCH HEG GENÈVE DÉPARTEMENT D'INFORMATIQUE DE GESTION – LABORATOIRE DE TECHNOLOGIES OBJET PROFESSEUR : PETER DAEHNE Albert Ritch – Les Web Services Page 1 novembre 2003 – v1.0 Préface Les Web Services sont récents dans les architectures distribuées. Permettant l'interopérabilité des systèmes distribués, ils permettent de s'affranchir d'un langage de programmation ou d'une plate-forme de développement précise. Apportant une brique importante aux architectures orientées services (SOA), ils sont une technologie passionnante à découvrir. Objectif L'objectif de ce travail est de brosser un panorama général des Web Services, en étudiant les normes et standards sur lesquels ils sont basés, notamment XML, SOAP, WSDL et UDDI. L'objectif est également de comprendre leur déploiement et fonctionnement dans une architecture distribuée à l'aide de mises en oeuvres, notamment avec l'architecture J2EE. Structure du document Tout d'abord, une partie théorique va présenter XML, le langage maternel des Web Services. Ensuite, les trois briques de bases des Web Services à savoir SOAP, WSDL et UDDI vont être présentées. Puis, les Web Services vont être étudiés dans le contexte des architectures distribuées et des technologies d'intégration. Enfin, la fin de la partie théorique va terminer par une présentation des plates-formes .NET et J2EE qui intègrent toutes deux les Web Services, ainsi qu'un récapitulatif général présentant quelques API et outils de mise en oeuvre. La partie pratique va comporter l'installation et la mise en oeuvre d'exemples à l'aide d'Axis et de Sun One Studio. Remerciements Je remercie tout particulièrement M. Peter Daehne, mon maître de diplôme, pour m'avoir guidé et conseillé durant ce travail. Je remercie également ma famille pour m'avoir soutenu durant mes études. Albert Ritch – Les Web Services Page 2 novembre 2003 – v1.0 Introduction Trop souvent, les systèmes d'information sont liés et évoluent en fonction de contraintes techniques alors qu'ils devraient être conçus en services métiers indépendant d'une technologie précise. Les Web Services apportent une brique importante à la conception d'architectures orientées services (SOA) en permettant de construire des applications réutilisables et indépendantes vis à vis d'une technologie utilisée. Ils permettent notamment d'encapsuler des services métiers et de les rendre disponibles via des protocoles standards indépendants de tout langage ou d'une plate forme technologique définie. Présentant un faible couplage, les Web Services sont une technologie peu intrusive pour les systèmes d'information qui les utilisent. Autorisant les connexions de type synchrone (RPC) ou asynchrone, les Web Services permettent une importante flexibilité d'utilisation ainsi que de nombreuses possibilités de mise en oeuvre dont notamment dans les technologies d'intégration ou dans l'ouverture vers les partenaires de type B2B (Business To Business). Les protocoles et normes qui sous-tendent les Web Services, tous basés sur XML, sont devenus suffisamment mûrs pour une utilisation dans des grands projets. D'ailleurs, la grande majorité d'éditeurs de logiciels proposent à l'heure actuelle des solutions intégrant les Web Services. C'est le cas des éditeurs de progiciels, de serveurs d'application ou de logiciels d'intégration. Les Web Services seraient-ils alors la technologie miracle qui devrait réussir là ou les technologies comme CORBA auraient échouées ? Albert Ritch – Les Web Services Page 3 novembre 2003 – v1.0 Résumé Les Web Services sont basés sur trois briques principales que sont SOAP (Simple Object Access Protocol), WSDL (Web Service Description Langage) et UDDI (Universal Description, Discovery and Integration). Le langage utilisé qui sous-tend ces protocoles est XML, ce qui rend les Web Services indépendants des plates-formes et des langages de programmation. SOAP est un protocole de transmission de messages permettant l'échange unidirectionnel ou bidirectionnel de messages entre le consommateur du service et le serveur. WSDL décrit quand à lui le Web Service de manière indépendante à tout langage de programmation et UDDI permet de référencer les Web Services tout en proposant également les indications commerciales utiles sur les entreprises. Le champ d'utilisation des Web Services est vaste. Il comprend par exemple les technologies d'intégration dans le cadre de nouveau EAI nommés ESB (Enterprise Service Bus) qui se basent sur des standards comme les connecteurs JCA de SUN. Les échanges B2B profitent également de l'apparition des Web Services. Ainsi, une entreprise peut directement ouvrir des parties de son système d'information à ses partenaires sous forme de services. Les éditeurs de solutions logicielles tels que les fournisseurs de progiciels, de serveurs d'application ou d'environnement de développement intègrent maintenant les Web Services dans leurs solutions. Microsoft et IBM sont à l'origine de la majorité des normes utilisées dans les Web Services. Même si ils ont proposé très tôt des outils de développement de Web Services, la majorité des entreprises les ont rattrapés. Albert Ritch – Les Web Services Page 4 novembre 2003 – v1.0 Table des matières 1. Introduction aux Web Services ....................................................................................................................12 1.2 Fonctionnement de base ........................................................................................................................13 2. XML .............................................................................................................................................................14 2.1 Syntaxe XML ........................................................................................................................................14 2.1.1 Syntaxe d'un document XML .......................................................................................................14 2.1.2 XML Schema ................................................................................................................................15 2.1.3 Liens XML....................................................................................................................................19 2.2 Parsing de documents XML..................................................................................................................19 3. Architecture et normes des Web Services ....................................................................................................21 3.1 Spécifications des Web Services...........................................................................................................21 3.2 SOAP.....................................................................................................................................................21 3.1.1 Structure d'un message SOAP.......................................................................................................22 3.1.2 Exemples de base de messages SOAP (SOAP 1.2) ......................................................................22 3.1.3 Chaînes d'acheminement...............................................................................................................24 3.1.4 Typage...........................................................................................................................................24 3.1.5 Gestion des erreurs........................................................................................................................25 3.1.6 Attachements.................................................................................................................................26 3.3 WSDL ...................................................................................................................................................27 3.3.1 Structure d'un fichier WSDL.........................................................................................................27 3.3.2 Utilisation d'un document WSDL .................................................................................................29 3.4 UDDI.....................................................................................................................................................32 3.4.1 Structure de documents UDDI ......................................................................................................32 3.4.2 Accès à un annuaire UDDI ...........................................................................................................33 3.4.3 Publication d'un Web Service .......................................................................................................37 4. Les Web Services et les protocoles d'applications distribuées .....................................................................38 4.1 Les protocoles de communication dans les architectures distribuées....................................................38 4.1.1 RMI ...............................................................................................................................................38 4.1.2 EJB ................................................................................................................................................39 4.1.3 COM+ ...........................................................................................................................................39 4.1.4 .NET Remoting .............................................................................................................................39 4.1.5 Corba.............................................................................................................................................39 4.1.6 Autres technologies (Janeva) ........................................................................................................39 4.2 Corba et les Web Services.....................................................................................................................39 4.2.1 Avantage des Web Services par rapport à CORBA ......................................................................40 4.2.1 Avantages de CORBA ..................................................................................................................40 4.2.2 CORBA ou les Web Services ?.....................................................................................................40 5. Les Web Services et les technologies d'intégration (EAI) ...........................................................................41 5.1 Intégration point à point ........................................................................................................................41 5.2 EAI ........................................................................................................................................................41 5.2.1 Middleware ...................................................................................................................................42 5.3 Convergence entre les EAI et le e-business ..........................................................................................43 5.4 ESB (Enterprise Service Bus) ...............................................................................................................44 6. Plates-formes et outils de développement ....................................................................................................45 6.1 La plate-forme .NET .............................................................................................................................45 6.3 Plate-forme J2EE .............................................................................................................................47 6.3 Récapitulatif des outils pour la mise en oeuvre des Web Services .......................................................49 6.1.1 API pour le développement de Web Services (client ou serveur).................................................49 Annexe A : Installation et configuration de Tomcat et d'Axis .........................................................................52 A.1. Obtenir les softwares ...........................................................................................................................52 A.2. Installation et configuration de Tomcat...............................................................................................52 A.2.1 Lancement et arrêt de Tomcat :....................................................................................................52 A.3. Installation et configuration d'Axis ..........................................................................................................54 A.3.1 Lancement et arrêt de Axis...........................................................................................................54 Albert Ritch – Les Web Services Page 5 novembre 2003 – v1.0 A.4. Installation de Axis (API) au niveau client .........................................................................................55 A-5 Installation de Sun One Server.............................................................................................................56 Annexe B : Mises en oeuvres ...........................................................................................................................57 B.1. Déploiement d'un Web Service simple................................................................................................57 B.2 Déploiement d'un service de convertisseur de devises .........................................................................59 B.2.1 Introduction ..................................................................................................................................59 B.2.2 Mise en place du Web Service .....................................................................................................59 B.2.2 Création du client en VBA ...........................................................................................................63 B.2.3 Intégration dans MS Office ..........................................................................................................65 B.3 Client C# avec Visual Studio................................................................................................................70 B-5 Scénario de e-banking ..........................................................................................................................73 B-5.1 Création du Web Service d'informations bancaires .....................................................................74 B-5.2 Création de la partie informations boursières du client................................................................77 B-5.3 Création de la partie banque GBS ................................................................................................81 B-5.4 Fin de la partie client....................................................................................................................82 Albert Ritch – Les Web Services Page 6 novembre 2003 – v1.0 Illustrations et tableaux Illustrations Figure 1-1 Architecture globale des Web Services Figure 1-2 Consommation d'un Web Service Figure 2-1 Parsing de document XML Figure 3-1 Enveloppe SOAP Figure 3-2 Interception de l'invocation du service Calculator Figure 3-3 Représentation schématique d'un fichier WSDL avec XMLSPY Figure 3-4 Représentation schématique du fichier WSDL pris en exemple (XMLSPY) Figure 3-5 Structure de document UDDI Figure 3-6 Recherche dans l'annuaire UDDI d'IBM Figure 3-7 Résultats de la recherche Figure 3-8 Description de l'entreprise Figure 4-1 Requête à un objet distant Figure 5-1 Intégration point-à-point Figure 5-2 Broker d'intégration Figure 5-3 Intégration avec les partenaires Figure 5-4 ESB (Enterprise Service Bus) Figure 6-1 La plate-forme .NET Figure 6-2 Architecture des Web Services avec .NET Figure 6-3 Plate-forme J2EE Figure 6-4 Architecture des Web Services avec J2EE Figure A-1 Page de démarrage de Tomcat Figure A-2 Fenêtre de démarrage d'Axis Figure B-1 Mise en oeuvre 1 : exécution de CalcClient Figure B-2 Mise en oeuvre 2 : exécution de Java2WSDL Figure B-3 Notre Web Service est déployé Figure B-4 Résultat de l'exécution du clientFigureB-5 : Création de la feuille Excel Figure B-5 Création de la feuille Excel Figure B-6 Editeur VBA Figure B-7 Résultat après invocation du Web Service Figure B-8 Utilisation du Web Service en tant que fonction Figure B-9 Création de la feuille Excel Figure B-10 Ajout du Web Service Figure B-11 Recherche du fichier de description WSDL Figure B-12 Les méthodes sont trouvées Figure B-13 Interface graphique en C# Figure B-14 Résultat Figure B-15 Schéma du scénario Figure B-16 : Classes serveur Reuters Figure B-17 : Plate-forme J2EE Figure B-18 : Génération du Web Service Figure B-19 : Package ReutersServeur Figure B-20 : La maquette de la fenêtre des titres Figure B-21 : Les titres reçus du serveur Reuters Figure B-22 : Diagramme de classe de la banque Figure B-23 : Choix d'un titre Figure B-24 : Validation de l'achat Figure B-25 : Paramètres d'achat Figure B-26 : L'ordre est passé Albert Ritch – Les Web Services Page 7 novembre 2003 – v1.0 Tableaux Tableau 2-1 facettes avec leur description Tableau 3-1 Les requêtes accessibles prévues dans l'API Tableau 6-1 Outils de mise en oeuvre Albert Ritch – Les Web Services Page 8 de Web Services novembre 2003 – v1.0 Abréviations et symboles API Application Programming Interface B2B Business To Business B2C Business To Consumer CLR Common Language Runtime COM Component Object Model COM+ Component Object Model plus CORBA Common Object Request Broker Achitecture CRM Customer Relationship Management DCOM Distributed Component Object Model DOM Document Object Model EDI Échange de Données Informatisé EJB Enterprise Java Bean ERP Entreprise Resources Planning ESB Enterprise Service Bus IDL Interface Definition Language IIOP Internet Inter-ORB Protocol JAXP Java API for XML Processing JCA J2EE Connector Architecture JVM Java Virtual Machine MOM Message-Oriented Middleware ORB Object Request Broker RMI Remote Method Invocation RPC Remote Procedure Call SOA Service Oriented Architecture SOAP Simple Object Access Protocol UDDI Universal Description, Discovery and Integration URI Uniform Ressource Identifier WSDL Web Service Description Language Albert Ritch – Les Web Services Page 9 novembre 2003 – v1.0 Glossaire Applet Petit programme Java destiné a être téléchargé et utilisé au niveau client dans un navigateur Web Broker de messages Dans un environnement orienté objet, un broker de messages sert à réguler les messages entre objets Business To Business B2B Commerce entre deux entreprises Business To Consumer B2C Commerce entre une entreprise et les consommateurs Common Language CLR Runtime Machine virtuelle faisant partie de framework .NET permettant l'exécution de programmes (C#, VB.NET, J#, ...) Common Object Request Broker Achitecture Component Object Model CORBA Standard de gestion d'objets distribués permettant à des applications de langages différents de communiquer (voir ORB et IDL) Component Object Model plus COM+ Version améliorée de COM COM Standard de gestion d'objets distribués Connecteur Logiciel interfaçant une application et le broker de messages d'un EAI Courtier de messages Voir broker de messages Customer Relationship Management Distributed Component Object Model Document Object Model CRM Progiciel de la relation client DCOM Extension du protocole COM, permettant de supporter les objets répartis sur le réseau DOM Spécification du W3C dont les implémentations permettent de parser des documents XML en créant un arbre en mémoire Enterprise Java Bean EJB Objets distribuées Java Enterprise Service Bus Nouvelle génération d'EAI s'appuyant sur des standards comme les JCA et les Web Services ESB Entreprise Resources ERP Planning Albert Ritch – Les Web Services Progiciel de gestion Page 10 novembre 2003 – v1.0 Fat client Client lourd (application créée avec les bibliothèques graphiques comme Swing ou les MFC) Interface Definition IDL Language Langage de description des services orientés objets distribués sous CORBA Internet Inter-ORB Protocol IIOP Protocole CORBA permettant à deux bus ORB de communiquer ensemble J2EE Connector Architecture JCA Interface d'accès aux applications Java. Utilisé comme connecteur dans les ESB Java API for XML Processing JAXP API Java pour la manipulation de documents XML Java Virtual Machine JVM Machine virtuelle Java permettant d'exécuter un programme Java Logiciel adaptateur voir connecteur Message-Oriented Middleware MOM middleware Mécanisme asynchrone d'échange de messages entre applications Logiciel transportant les informations échangées par des applications distribuées Object Request Broker ORB Broker permettant de faire communiquer des objets sous CORBA Remote Method Invocation RMI Mécanisme de Sun servant à utiliser des objets distribués Remote Procedure Call RPC Un protocole RPC gère les interactions du client et du serveur dans le cas d'environnements distribués Service Oriented Architecture SOA Architecture où les processus métiers de l'entreprises sont vus comme des services réutilisables et indépendants de toute technologie Applet étant exécutée sur le serveur et non pas chez le client SOAP Protocole d'échange de messages des Web Services s'appuyant sur XML Servlet Simple Object Access Protocol Thin client Client léger (browser Web) Uniform Ressource URI Identifier Localisateur d'un document distant sur Internet Web Service Composants logiciels se localisant sur Internet et dont les protocoles de communication utilisent des standards comme HTTP et XML Albert Ritch – Les Web Services Page 11 novembre 2003 – v1.0 1. Introduction aux Web Services [DON02] Technologie innovatrice, les Web Services ne sont pas une révolution mais plutôt une évolution car ils se basent sur des technologies connues et éprouvées. XML qui est la langue maternelle des Web Services, apporte une grande souplesse d'utilisation. En effet, les fichiers sont lisibles directement par un humain, ce qui facilite le déboguage par exemple. On peut définir les Web Services comme des composants logiciels se localisant sur Internet (architectures distribuées) et dont les protocoles de communication utilisent des standards reconnus comme HTTP et XML. Les Web Services supportent les modes d'utilisation synchrone ou asynchrone et présentent un faible couplage par rapport aux applications client. Trois briques de base constituent les Web Services. Il s'agit tout d'abord de SOAP (Simple Object Access Protocol) qui est le protocole de communication fondé sur XML utilisé dans les Web Services. Il permet de décrire les informations transitant via le réseau, de manière simple et efficace. L'invocation de méthodes distantes (RPC) se fait grâce à SOAP qui contient les appels des méthodes invoquées ainsi que leurs arguments. Fig. 1-1 : Architecture globale des WS La deuxième brique est WSDL (Web Service Description Langage) qui permet de décrire un Web service et de le localiser afin que le client connaisse les caractéristiques des méthodes à invoquer et de leurs paramètres. La troisième brique se nomme UDDI (Universal Description, Discovery and Integration ) qui est une norme d'annuaires permettant de répertorier des Web Services. Actuellement à la version 2.0, la spécification UDDI est validée par l'OASIS1 (Organization for the Advancement of Structured Information Standards ). Des briques additionnelles servent à la sécurité et aux transactions. 1. URL : http://www.oasis-open.org/home/index.php Albert Ritch – Les Web Services Page 12 novembre 2003 – v1.0 1.2 Fonctionnement de base Les Web Services fonctionnent suivant une architecture client/serveur. La demande de service et sa réponse sont transportés via le réseau à l'aide des protocoles HTTP et TCP/IP et toutes les requêtes effectuées, que se soit par le serveur ou le client, se font via SOAP. L'utilisation de protocoles standards, ouverts et maîtrisés par les acteurs du marché est une des raisons de l'engouement actuel pour les Web Services. Le client peut être indifféremment un « fat client » (C++, C#, Java, ...) ou un « thin client » (browser, PDA). Il peut également s'agir d'un progiciel, d'un élément d'une suite bureautique, etc. Le serveur quand à lui peut être un serveur d'applications J2EE, .NET, etc. Il est tout à fait possible de créer des Web Services à partir d'une combinaisons d'autres Web Services, afin de proposer une solution métier complète. Recherche et consommation d'un Web Service : 1. Après avoir créé et déployé ses Web Services, le serveur publie les documents WSDL correspondants auprès d'un annuaire UDDI. 2. Le client, pour invoquer un Web Service, va le rechercher sur un annuaire UDDI. 3. Une fois trouvé, il va télécharger le document WSDL correspondant. Les documents WSDL contiennent les spécifications des Web Services proposés par le serveur. 4. Le client invoque le Web Service. 5. Le serveur exécute le code du Web Service et en renvoie le résultat. Fig. 1-2 : Consommation d'un Web Service Albert Ritch – Les Web Services Page 13 novembre 2003 – v1.0 2. XML [01I01], [MAE03] XML est un standard régi par le W3C qui est un consortium regroupant les principaux acteurs du marché (Microsoft, Sun, Oracle, ...). HTML et XML ont tous deux la même origine à savoir le SGML2. En fait, XML est un sous-ensemble de SGML. Cependant si HTML se contente de permettre la mise en forme de pages Internet, XML décrit les données afin qu'une mise en forme spécifique leur soit appliquée. On dit de XML que c'est un méta-langage. C'est à l'utilisateur de construire des balises personnalisées et de gérer la sémantique. En décrivant les données et leur relations entre-elles, il peut être utilisé comme support pour véhiculer ces données via le Web. 2.1 Syntaxe XML Les règles syntaxiques sont peu nombreuses mais un document XML doit parfaitement s'y conformer afin qu'un outil de visualisation (browser, ...) puisse l'interpréter. 2.1.1 Syntaxe d'un document XML Balises Un document XML doit commencer par une ligne de déclaration : <?xml version="1.0"?> La même mais avec la spécification d'encodage des données : <?xml version="1.0" encoding="UFT-8"?> Les éléments du document doivent être encadrés par des balises ouvrantes et fermantes : <nom>Dupont</nom> Attention, les balises sont sensibles à la casse. Il faut donc qu'elles soient identiques de part et d'autre. Par exemple la balise de fermeture ci-dessous est incorrecte : <nom>Dupont</Nom> Des balises encadrant un élément vide peuvent être « factorisées ». Par exemple si la personne Dupont n'a pas d'e-mail on peut écrire : <email></email> Equivalent à : <email/> A l'inverse des balises en HTML, la disposition des balises doivent être disposées strictement en paires imbriquées (comme les parenthèses ouvrantes et fermantes). Par exemple l'exemple ci-dessous est correct : <autresinfos><email>[email protected]</email></autresinfos> Mais celui ci-dessous est incorrect : <email><autresinfos>[email protected]</email></autresinfos > Un document XML est construit de manière arborescente. Le premier élément du document en étant la racine. Exemple : 2. SGML (Standard Generalized Markup Language) : Métalangage permettant de définir des documents hypertexte de tous types. XML et HTML sont des sous ensembles de SGML. Albert Ritch – Les Web Services Page 14 novembre 2003 – v1.0 <?xml version="1.0" encoding="UFT-8"?> -<client> <nom>Dupont</nom> <prenom>Jean</prenom> -<adresse> <numero>3</numero> <rue>rue des Chênes</rue> <code_postal>1202</code_postal> <ville>Genève</ville> </adresse> </client> Des espaces ne doivent pas figurer dans une balise comme dans l'exemple ci-dessous : </ adresse> De même, il ne peut y avoir d'espaces entre les caractères inclus dans une balise : <adresse personnelle> Un chiffre ne peut être utilisé comme premier caractère d'une balise <1234adresse> Les commentaires sont écrits ainsi : <!-- un commentaire --> Attributs Les attributs sont des éléments additionnels permettant de décrire des informations. <taille unite="cm">175</taille> Namespaces Les namespaces permettent de qualifier les éléments ou attributs en permettant de les différencier sémantiquement. <mesureMeteo> <echelle>Pression</echelle> <bars>2</bars> <echelle>Degrés</echelle> <temperature>25</temperature> </mesureMeteo> Comment connaître la signification de l'échelle ? Est-ce des bars ou une température ? On va utiliser une qualification d'espaces de noms : <mesureMeteo xmlns:ns1="bars" xmlns:ns1="temperature"> <ns1:echelle>Pression</ns1:echelle> <bars>2</bars> <ns2:echelle>Degrés</ns2:echelle> <temperature>25</temperature> </mesureMeteo> Avec ce namespaces, on peut ainsi différencier les deux types d'échelles. 2.1.2 XML Schema XSD ou XML Schema Definition succède aux DTD qui étaient lourdes et non écrites en XML. XML Schema permet de décrire la structure d'un document XML et sert également au typage des données. Albert Ritch – Les Web Services Page 15 novembre 2003 – v1.0 Un schéma fait de préférence partie d'un document annexe (réutilisable) plutôt que d'être inclus dans le document XML qu'il décrit. Le typage des données est nettement amélioré avec XML Schema par rapport aux DTD. Les types de bases sont tous représentés (string, long, int, date, ...) et il est possible de créer des types dits complexes. Un document XSD commence par un élément schema. Exemple : <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> Si les document XSD sont des fichiers de description, les instances sont les fichiers XML décrits par les documents XSD : <element name="Automobile" type="Automobile"/> <typeComplexe name="Automobile"> <element name="modele" type="xsd:string"/> <element name="marque" type="xsd:string"/> <element name="annee" type="xsd:int"/> </typeComplexe> Voici l'instance correspondante à cette fraction de schéma : <uneVoiture xsi:type="Automobile"> <modele>Corvette</modele> <marque>Chevrolet</marque> <annee>2000</annee> </uneVoiture> Un fichier de description XSD peut donner lieu à un nombre quelconque d'instances. Autre exemple : <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:element name="client" type="TypeClient"/> <xsd:complexType name="TypeClient"> <xsd:sequence> <xsd:element name="nom" type="xsd:string"/> <xsd:element name="prenom" type="xsd:string"/> <xsd:element name="dateNaissance" type="xsd:date"/> <xsd:element name="adresse" type="TypeAdresse"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TypeAdresse"> <xsd:sequence> <xsd:element name="numero" type="xsd:int"/> <xsd:element name="rue" type="xsd:string"/> <xsd:element name="codePostal" type="xsd:string"/> <xsd:element name="ville" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="pays" type="xsd:string"/> </xsd:complexType> </xsd:schema> Un élément element permet de représenter un élément dans un document XSD <xsd:element name="numero" type="xsd:int"/> Albert Ritch – Les Web Services Page 16 novembre 2003 – v1.0 Les éléments attribute sont des compléments des éléments element dans la spécification de types. Les éléments element peuvent être des types complexes alors que les éléments attribute ne peuvent qu'être des types simples. <xsd:attribute name="pays" type="xsd:string"/> Les facettes ou restrictions servent à définir des valeurs simples en précisant un intervalle de valeurs ou une exepression régulière par exemple. Exemple : la facette enumeration permet d'énumérer des valeurs autorisées. Les facettes d'un document XSD (ou restrictions) peuvent être classées en trois catégories : 1. la facette whiteSpace s'applique à l'espace normalisé et lexical des types string et normalizedString 2. la facette pattern s'applique qu'à l'espace lexical 3. les autres facettes s'appliquent à l'espace des valeurs Tab 2-1 : facettes avec leur description Facette Description enumeration Sert à spécifier les valeurs autorisées. Exemple : <xsd:simpleType name="DebutListeNombresPremiers"> <xsd:restriction base="xsd:int"> <xsd:enumeration value="2"/> <xsd:enumeration value="3"/> <xsd:enumeration value="5"/> <xsd:enumeration value="7"/> </xsd:restriction> </xsd:simpleType> Permet de définir le nombre de décimales autorisées Permet de spécifier le nombre exact de caractères (ou d'octets) Spécifie une valeur maximale qui ne peut être atteinte Spécifie une valeur maximale qui peut être atteinte Permet de spécifier le nombre maximum de caractères (ou d'octets) Spécifie une valeur minimale qui ne peut être atteinte Spécifie une valeur minimale qui peut être atteinte Permet de spécifier le nombre minimum de caractères (ou d'octets) Définit un modèle à respecter grâce à des expressions régulières. L'exemple ci-dessous de pattern implique que l'élément doit être un nombre de 5 chiffres. <xsd:pattern value="[0-9]{5}"/> Spécifie le nombre exact de chiffres Définit l'interpretation des espaces fractionDigit length maxExclusive maxInclusive maxLength minExclusive minInclusive minLength pattern totalDigits whiteSpace Types Dans les documents XML Schema, les types peuvent soit être simples soit complexes. Les types simples caractérisent la valeur d'un élément ou d'un attribut alors que les types complexes caractérisent la structure et le modèle de contenu. Ils concernent donc plus des types précis de documents que les types simples qui peuvent concerner des documents ayant même des schémas différents. Types simples Les types simples sont définis à partir de la facette simpleType. Un schéma XML est accompagné de types basiques (string, long, date, ...) qui sont comparables aux types de base des langages de programmation. Les types simples sont des restrictions des types basiques. Ils comportent donc obligatoirement des facettes en plus. Cette application de restriction se fait par dérivation par exemple. Il existe plusieurs types de dérivations et la manière de dériver est différente pour un type simple et un type complexe. Albert Ritch – Les Web Services Page 17 novembre 2003 – v1.0 Dérivation par restriction Exemple de type simple en dérivant par restriction: <xsd:element name="codeBancaire" fixed="1"> <xsd:simpleType> <xsd:restriction base="xsd:string" <xsd:pattern value="[0-9]{4}\-[0-9]{6}\-[0-9]{4}"> </xsd:restriction> </xsd:simpleType> </xsd:element> Si un type simple est déclaré dans un type complexe, il est local. Sinon il est global et peut être réutilisé. <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:element name="codeBancaire"> <xsd:simpleType> <xsd:restriction base="xsd:string" <xsd:pattern value="\d{4}\-\d{6}\-\d{4}"> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="cordonnesBancaires"> <xsd:element name="banque" type="xsd:string"> <xsd:element ref="codeBancaire" fixed="1"> </xsd:element> </xsd:schema> Dérivation par union Il est également possible de créer des types composés à partir de types simples en appliquant l'opérateur union : <xsd:union memberTypes="typeSimple1 typeSimple2"> La dérivation d'un type simple peut être empêchée en la rendant final <xsd:union meberTypes="typeSimple1 typeSimple2" final=#all> Expressions régulières Les expressions régulières permettent d'ajouter des contraintes aux types de bases d'un type simple en définissant un motif auquel devra s'adapter un élément comme un chaine de caractères par exemple. C'est la facette pattern qui permet d'appliquer des expressions régulières à des éléments. Les caractères permettant de créer des expressions régulières sont notamment : • les caractères spéciaux (\n pour nouvelle ligne, \r pour retour de chariot, \\ pour le caractère \, ...) • les caractères génériques qui permettent de remplacer n'importe quel caractère • les classes de caractère qui sont issues des langages Perl et Unicode plus une série d'ajouts Albert Ritch – Les Web Services Page 18 novembre 2003 – v1.0 Types complexes Les types complexes définissent les types des éléments et la structure des éléments les composant. Exemple : <xsd:complexType name="TypeAdresse"> <xsd:sequence> <xsd:element name="numero" type="xsd:int"/> <xsd:element name="rue" type="xsd:string"/> <xsd:element name="codePostal" type="xsd:string"/> <xsd:element name="ville" type="xsd:string"/> <xsd:element name="pays" type="xsd:string"/> </xsd:sequence> </xsd:complexType> 2.1.3 Liens XML Les liens XML permettent de pointer d'un document vers un autre tout comme les liens HTML. Deux méthodes sont disponibles pour gérer les liens : XLink et XPointer. XLink est équivalent aux liens HTML pour naviguer de page en page alors que XPointer est équivalent aux ancres qui permettent de naviguer à l'intérieur du document. En plus de reprendre les caractéristiques des liens HTML, les liens XML apportent des fonctions supplémentaires comme par exemple la possibilité de pointer vers plusieurs documents ou d'utiliser n'importe quelle balise XML comme lien alors que HTML impose la balise <a></a>. Exemple de lien simple : <nom xmlns:xlink="http://www.w3.org/1999/xlink/" xlink:type="simple" xlink:href="http://www.site.com" xlink:title="Titre du lien"> Dupont </nom> 2.2 Parsing de documents XML Le parsing est la transformation d'un document XML en code source. L'application accède aux services proposés par l'API pour parser le document XML afin d'accéder, de créer et de mettre à jour un document XML. Le parsing peut se comparer à la compilation. Le parser vérifie tout d'abord que le document XML est bien construit et si ce n'est pas le cas il s'arrête à la première erreur. Le parsing de documents XML peut se faire de deux manières : Avec DOM (Document Object Model) qui est une spécification standardisée par le W3C ou avec SAX (Simple API for XML) qui est une spécification opensource non standardisée mais étant devenue une norme de fait. Albert Ritch – Les Web Services Page 19 Fig. 2-1 : Parsing de document XML novembre 2003 – v1.0 Alors qu'un parser DOM « compile » un fichier XML en générant un arbre d'objets en mémoire, SAX déclanche des événements correspondants aux ouvertures / fermetures de balises du document. Implémentations Il existe des implémentations des spécifications DOM et SAX pour tous les langages. Par exemple, MSXML est l'implémentation de DOM incluse dans Microsoft Internet Explorer. Dans le monde Java, les implémentations JAXP3 de Sun ou Xerces4 de Apache sont disponibles. 3. JAXP : http://java.sun.com/xml/jaxp/ 4. Xerces : http://xml.apache.org/ Albert Ritch – Les Web Services Page 20 novembre 2003 – v1.0 3. Architecture et normes des Web Services 3.1 Spécifications des Web Services Les spécification des éléments des Web Services sont établies par deux organismes, le W3C (World Wide Web Consortium) et le WS-I (Web Services Interoperability Organization). Le W3C, organisme de définition des éléments du Web travaille en collaboration avec le WS-I qui a été créé par Microsoft, IBM et BEA afin de promouvoir les Web Services. On peut citer également l'OASIS, organisme de spécification des annuaires des Web Services, UDDI. Les spécifications consistent en des règles soumises à différents niveaux d'obligations comme par exemple MUST pour obligatoire, SHOULD pour recommandé, OPTIONAL pour optionnel, SHOULD NOT pour non recommandé ou MUST NOT pour interdit. En juin 2003, le W3C annonce la disponibilité des spécifications de la version 1.2 de SOAP qui passe à l'état de recommandation, ce qui en fait un standard. Cette évolution très attendue permet de corriger un grand nombre d'erreurs et d'améliorer la représentation des données (par schémas XML) ainsi que leur codage. Etant donné que les spécifications de la version 1.2 sont récentes, ce chapitre va également traiter la version 1.1 de SOAP. Concernant WSDL, la version actuelle est la 1.1 et la 1.2 devrait apparaître en 2004. Cependant le W3C confirme qu'il est tout à fait possible d'utiliser SOAP 1.2 avec WSDL 1.1. On peut trouver les spécifications de SOAP 1.15 sur le site du WS-I et pour les spécifications de SOAP 1.26 sur le site du W3C (documents « SOAP Version 1.2 Part 0: Primer », « SOAP Version 1.2 Part 1: Messaging Framework », « SOAP Version 1.2 Part 2: Adjuncts » et « SOAP Version 1.2 Specification Assertions and Test Collection »). Note : dans ce travail les version 1.1 et 1.2 de SOAP seront les deux utilisées mais avec une annotation. 3.2 SOAP [MAE03], [CHA102], [ENG03], [SOA203], [SOA103] SOAP (Simple Object Access Protocol) est un protocole de transmission de messages basé sur XML. Il définit le format des messages qui sont utilisés pour des requêtes unidirectionnelles et plus généralement bidirectionnelles de type RPC qui permettent d'invoquer des méthodes distantes. Indépendant des systèmes d'exploitation ou des langages de programmation, SOAP utilise principalement HTTP comme protocole de transport à travers les réseaux bien qu'il puisse utiliser d'autres protocoles comme SMTP ou FTP. Les implémentations de SOAP doivent donc obligatoirement supporter HTML. Historiquement, très peu de temps après la publication de la première spécification XML en 1998 par le W3C, un groupe de développeurs met au point un protocole d'appel de procédures distantes de type RPC nommé XML-RPC. Ensuite apparaissent des outils de manipulation de XML de plus en plus performants pour des langages divers. C'est à partir de XML-RPC que SOAP va être élaboré. 5. Spécifications SOAP 1.1 (site du WS-I) : http://www.ws-i.org/Profiles/Basic/2003-08/BasicProfile-1.0a.html 6. Spécifications SOAP 1.2 (site du W3C) : http://www.w3.org/2000/xp/Group/ Albert Ritch – Les Web Services Page 21 novembre 2003 – v1.0 Grâce à SOAP il est possible, par exemple, d'invoquer des méthodes d'EJB à partir d'un client écrit en C#. En effet, SOAP est un protocole d'échange Web qui se doit d'être indépendant des environnement d'exécution, des langages et des systèmes d'exploitation. 3.1.1 Structure d'un message SOAP Un message SOAP est encapsulé dans une enveloppe. Cette enveloppe contient une en-tête qui est facultative et un corps. Fig. 3-1 : Enveloppe SOAP Voici la structure d'une enveloppe SOAP (SOAP 1.2) : <?xml version="1.0" ?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope "> .. .. </env:Envelope> 3.1.2 Exemples de base de messages SOAP (SOAP 1.2) Voici un message SOAP très simple correspondant à la figure 3-1 : <?xml version="1.0" ?> <env:Envelope xmls:env="http://www.w3.org/2003/05/soap-envelope"> <env:Body> <h:DonneHeureCourante xmlns:h="Horloge"> <h:format>hhmmss</h:format> </h:DonneHeureCourante> </env:Body> <env:Envelope> Et voici la réponse : <?xml version="1.0" ?> Albert Ritch – Les Web Services Page 22 novembre 2003 – v1.0 <env:Envelope xmls:env="http://www.w3.org/2003/05/soap-envelope"> <env:Body> <h:DonneHeureCourante xmlns:h="Horloge"> <h:heure>14:34:20</h:heure> </h:DonneHeureCourante> </env:Body> <env:Envelope> Prenons un autre exemple plus concret. Axis comprend un utilitaire nommé tcpmon qui permet d'intercepter les messages SOAP, agissant comme un intermédiaire entre le client et le Web Service. Il écoute sur un port d'entrée, intercepte les messages SOAP et les renvoie au port correspondant au Web Service. Prenons pour exemple le Web Service très simple de l'annexe B.1. Pour pouvoir passer par tcpmon, il faut légèrement modifier le code du client, à savoir le fichier CalcClient2.java issu du fichier renommé CalcClient.java. Modifions la ligne comportant le string de localisation du Web Service de : String endpoint = "http://192.168.1.33:" + options.getPort() + "/axis/Calculator.jws"; ...en : String endpoint = "http://192.168.1.33:8070/axis/Calculator.jws"; En fait le port du serveur Axis est bien le 8080, mais changeons le en 8070 qui sera le port d'entrée de tcpmon. Après compilation (se référer à l'annexe B.1) de CalcClient2.java, lancer tcpmon : java org.apache.axis.utils.tcpmon Puis invoquer le Web Service. java meo1/CalcClient2 add 4 3 Voici le message SOAP (SOAP 1.1) envoyé au serveur : <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <add soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <op1 xsi:type="xsd:int">4</op1> <op2 xsi:type="xsd:int">3</op2> </add> </soapenv:Body> </soapenv:Envelope> Et voici la réponse : <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <addResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <addReturn xsi:type="xsd:int">7</addReturn> </addResponse> Albert Ritch – Les Web Services Page 23 novembre 2003 – v1.0 </soapenv:Body> </soapenv:Envelope> On constate bien le codage des paramètres dans l'enveloppe SOAP ainsi que le résultat retourné. On peut également voir les types. On peut également constater dans la figure ci-dessous l'interception du message par tcpmon. Fig 3-2 : Interception de l'invocation du service Calculator Header (entête) L'entête est facultative mais si elle est présente, elle doit avoir la forme suivante : <env:Header> <\env:Header> Les header servent à ajouter des éléments utilisés dans les transactions, la sécurité ou les chaînes d'acheminement. 3.1.3 Chaînes d'acheminement Le transfert d'un message SOAP se fait généralement directement, de l'expéditeur au récepteur. Cependant, il est également possible qu'une série d'intermédiaires se situent entre l'expéditeur et le récepteur, formant une chaîne d'acheminement. Un intermédiaire appellé noeud intermédiaire, doit donc être en mesure de recevoir le message et de le renvoyer. Le but d'une chaîne d'acheminement est d'offrir des fonctionnalités supplémentaires comme la mise en cache, le cryptage et également la mise en place d'un routeur de services. 3.1.4 Typage Le typage des données de SOAP peut se faire soit en utilisant un XML Schema (XSD) externe, soit en incluant le typage dans le message. Dans le cas de l'utilisation d'un XML Schema externe (voir chap. 2), on va indiquer une référence à ce schéma. <c:codepostal xmlns:ens="http://www.site.com/schema.xsd"> CH-1234 </c:codepostal> Le fichier XML Schema va alors contenir le type de codepostal : <xs:element name="codepostal" type="xs:string"/> Dans le cas de l'inclusion directe du type dans le message, on utilise l'attribut xs:type : <c:codepostal xs:type="xs:string">CH-1234</ens:codepostal> Albert Ritch – Les Web Services Page 24 novembre 2003 – v1.0 Exemples de type Java avec leur correspondance SOAP : int a = 15; float x = 3.1415; java.lang.String s = "Bonjour"; <a xs:type="xs:int">15</a> <x xs:type="xs:float">3.1415</x> <s xs:type="xs:string">Bonjour</s> On peut également générer des tableaux avec des valeur composées : int[3] tableau = {100, 200, 300}; <tableau xs:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xs:int[3]"> <val>100</val> <val>200</val> <val>300</val> </tableau> 3.1.5 Gestion des erreurs Lors d'envoi de messages SOAP, des erreurs peuvent survenir lorsque la sémantique ou la syntaxe du message est incorrecte. Il est possible également que le récepteur ne puisse traiter le message. Une erreur SOAP est identifiée comme telle lorsque la connexion au service à bien été effectuée, que le message a bien été envoyé et que le message d'erreur ait été reçu en retour. Exemple de faute SOAP (SOAP 1.2) : <env:Envelope xmls:env="http:schemas.xmlsoap.org/soap/envelope/"> <env:Body> <env:Fault> <faultcode>env:Client</faultcode> <faultstring>Erreur Client</faultstring> <reason> <h:detailsfauteheure xmlns:h="Horloge"> <message>Le format jjmmaa est incorrect</message> <errorcode>1234</errorcode> </h:detailsfauteheure> </reason> </env:Fault> </env:Body> <env:Envelope> Certains langages de programmation tels que Java ou C++ possèdent un mécanisme de traitement des erreurs nommé exceptions. Lorsqu'une erreur survient dans un Web Service écrit par exemple en Java, une exception est levée. L'exception sera alors utilisée pour traiter le contenu du message SOAP d'erreur. Elément faultcode L'élément code (faultcode pour SOAP 1.1) est un sous élément de l'élément fault. Il permet au récepteur d'identifier la faute et d'agir en conséquence. Exemple : <code>env:Client</code> L'élément code peut contenir quatre types de codes caractérisant la faute. • VersionMismach est un code signalant que les balises de structure ne sont pas conforme à SOAP. • MustUnderstand signale que le récepteur n'a pas été en mesure de traiter un message qu'il se Albert Ritch – Les Web Services Page 25 novembre 2003 – v1.0 devait de traiter (MustUnderstand=1). Sender (Client avec SOAP 1.1) signale que le message est incorrect sémantiquement ou syntaxiquement, ou que l'information à traiter contenue dans le message est erronée ou absente. L'expéditeur est alors dans l'obligation de réécrire le message. • Receiver (Server avec SOAP 1.1) signale que l'erreur n'est pas due à l'expéditeur mais à un problème technique lié à un des noeuds intermédiaires ou au récepteur. Le message pourra être renvoyé tel quel. • DataEncodingUnknow (apparu avec SOAP 1.2) signale que le contenu du message ne peut être décodé. • Ces codes ne peuvent être autres que ceux énoncés ci-dessus (aucun code personnalisé ne peut apparaître). Elément faultstring L'élément faultstring permet d'ajouter un texte lisible par une personne. Exemple : <faultstring>Erreur Client</faultstring> Elément faultactor L'élément faultactor est facultatif mais si il est présent, il désigne le responsable de la faute. Exemple : <faultactor>http://www.service.com/unservice</faultactor> Elément detail L'élément detail donne des informations concernant les fautes. Si la faute n'est pas due à l'élément body alors l'élément detail ne doit pas être inclus. Elément reason L'élément reason donne des informations sur la faute et est lisible par un humain. Il est requis. 3.1.6 Attachements Les attachements de pièces jointes permettent de joindre un fichier tel qu'une image, un document pdf ou un fichier XML Schema par exemple. Il faut noter que ces fichiers joints seront encodés en binaire. Albert Ritch – Les Web Services Page 26 novembre 2003 – v1.0 3.3 WSDL [MAE03], [CHA102], [ENG03] WSDL (Web Service Description Language) permet de décrire de manière abstraite les opérations et messages d'un Web Service. Ce langage permet de développer la partie client de l'application invoquant le Web Service. Sans WSDL cela impliquerait que le client et le serveur soit connu et gérés par le même développeur. Ce cas de figure contraindrait à une faible réutilisabilité du Web Service. 3.3.1 Structure d'un fichier WSDL Pour illustrer l'analyse de la structure d'un fichier WSDL, prenons à nouveau un exemple pratique mis en oeuvre dans l'annexe B-2, à savoir un calculateur de Francs en Euro (et inversement). Cet exemple va nous permettre tout d'abord d'analyser la structure du document, puis d'étudier l'utilité d'un document WSDL en analysant le résultat de la création, à partir du document WSDL, des fichiers nécessaires au client et au serveur du Web Service. <?xml version="1.0" encoding="UTF-8"?> Definitions et espaces de noms <wsdl:definitions targetNamespace="urn:Exchange" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:Exchange" xmlns:intf="urn:Exchange" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> Messages <wsdl:message name="enEuroRequest"> <wsdl:part name="franc" type="xsd:double"/> </wsdl:message> <wsdl:message name="enFrancRequest"> <wsdl:part name="euro" type="xsd:double"/> </wsdl:message> <wsdl:message name="enEuroResponse"> <wsdl:part name="enEuroReturn" type="xsd:double"/> </wsdl:message> <wsdl:message name="enFrancResponse"> <wsdl:part name="enFrancReturn" type="xsd:double"/> </wsdl:message> Ports types (opérations) <wsdl:portType name="Exchange"> <wsdl:operation name="enFranc" parameterOrder="euro"> <wsdl:input message="impl:enFrancRequest" name="enFrancRequest"/> <wsdl:output message="impl:enFrancResponse" name="enFrancResponse"/> </wsdl:operation> Albert Ritch – Les Web Services Page 27 novembre 2003 – v1.0 <wsdl:operation name="enEuro" parameterOrder="franc"> <wsdl:input message="impl:enEuroRequest" name="enEuroRequest"/> <wsdl:output message="impl:enEuroResponse" name="enEuroResponse"/> </wsdl:operation> </wsdl:portType> Bindings <wsdl:binding name="ExchangeSoapBinding" type="impl:Exchange"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="enFranc"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="enFrancRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encod ing/" namespace="urn:Exchange" use="encoded"/> </wsdl:input> <wsdl:output name="enFrancResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Exchange" use="encoded"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="enEuro"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="enEuroRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Exchange" use="encoded"/> </wsdl:input> <wsdl:output name="enEuroResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Exchange" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> Service <wsdl:service name="ExchangeService"> <wsdl:port binding="impl:ExchangeSoapBinding" name="Exchange"> <wsdlsoap:address location="http://192.168.1.33:8080/axis/services/Exchange"/> </wsdl:port> </wsdl:service> </wsdl:definitions> Définitions Les définitions sont l'élément racine du document. Il comprend les espaces de noms et le corps du document. Messages Les messages décrivent de manière abstraite les types des données échangés entre le client et le serveur. Albert Ritch – Les Web Services Page 28 novembre 2003 – v1.0 Opérations Chaque opération est composé de messages d'entrée et de sortie qui constituent une unité. PortType Un type de port est une liste d'opérations du Web Service décrit. Les ports types sont des descriptions abstraites. Binding Décrit de manière concrète les implémentations du Web Service. Lie un PortType à un protocole comme SOAP, HTTP, ... . Un PortType peut avoir plusieurs binding. Services Définit l'adresse à laquelle le service pourra être invoqué. Certains logiciels comme XMLSPY permettent entre autre de créer / éditer un fichier WSDL et de le visualiser sous forme graphique. Cape Clear propose WSDL Editor qui est un logiciel gratuit permettant de créer / éditer des fichiers WSDL. Ci-dessous un exemple inclus dans le logiciel mettant en évidence les PortTypes notamment. Fig 3-3 : Représentation schématique d'un fichier WSDL avec XMLSPY 3.3.2 Utilisation d'un document WSDL Une entreprise voulant utiliser un Web Service d'un partenaire par exemple, va se servir du fichier WSDL décrivant le Web Service en question, afin de développer la partie client, en utilisant n'importe quel langage. Dans le cas de la création simultanée du Web Service et du client, il suffit de créer une interface du Web Service, de générer à partir de celle-ci le fichier WSDL correspondant et de le mettre à la disposition du développeur de la partie client afin qu'il puisse développer celle-ci indépendamment. Albert Ritch – Les Web Services Page 29 novembre 2003 – v1.0 Prenons un cas concret, par exemple un Web Service de simple addition nommé « Additionneur » dont voici l'interface (Java) : public interface Additionneur { public double add(double arg1, double arg2); } Admettons donc que le client et le Web Service soient écrits en Java et prenons par exemple l'utilitaire java2WSDL fournis avec Axis7 qui fait partie du package org.apache.axis.wsdl. C'est grâce à lui, comme son nom l'indique, que nous allons créer le fichier WSDL à partir de l'interface java du Web Service (Additionneur.class). Seconde étape, il faut générer les classes java utiles pour le client et le serveur. C'est l'utilitaire WSDL2java qui va nous permettre d'effectuer cette opération et créer les fichier suivants : Additionneur.java (classe interface serveur) C'est une nouvelle version de l'interface créée précédemment qui va en plus étendre la classe java.rmi.RemoteException. Bien que nous n'utilisions pas RMI, ceci va permettre de gérer les exceptions et de créer une faute incluse dans le message d'erreur SOAP en cas d'erreur et donc de levée d'exception. AdditionneurService.java Ce fichier est une interface permettant d'obtenir un objet Additionneur du Web Service (en fait un Stub). AdditionneurServiceLocator.java (classe client) Factory implémentant l'interface AdditionneurService.java. Le client ne va pas instancier directement le stub. La classe client (par exemple AdditionneurClient) va donc instancier AdditionneurServiceLocator afin de pouvoir utiliser ses méthodes pour obtenir une instance de la classe AdditionneurSoapBindingStub à partir des méthodes de laquelle l'invocation du service pourra être faite. AdditionneurSoapBindingStub.java (classe client) Classe concrète implémentant la nouvelle interface Additionneur.java. C'est la partie cliente qui permet de faire la connexion avec le Web Service en générant un message SOAP contenant le nom de la méthode du Web Service avec ses paramètres. Il sert également à décoder le message SOAP afin de transformer le résultat en paramètres lisibles par le client. AdditionneurSoapBindingSkeleton.java (classe serveur) Classe concrète implémentant la nouvelle interface Additionneur.java. C'est la partie serveur qui permet de décoder / encoder le message SOAP faisant le lien entre le service écrit en Java et le XML du message SOAP. AdditionneurSoapBindingImpl.java (classe serveur) C'est l'implémentation du Web Service. Il faut le compléter afin qu'il contienne la méthode concrète servant à additionner. 7. Axis est un projet du groupe Apache permettant de mettre en oeuvre des Web Services Albert Ritch – Les Web Services Page 30 novembre 2003 – v1.0 Fig 3-4 : Représentation schématique du fichier WSDL pris en exemple (XMLSPY) A travers cet exemple, on constate l'utilité d'un fichier de description d'un Web Service WSDL. Il permet de générer tout ce dont ont besoin le client et le serveur. En utilisant Axis, nous avons pu suivre pas à pas la génération des fichiers utiles à la création d'un Web Service et de son client. La création des fichiers utiles aux parties client et serveur se font de manière plus ou moins transparente en fonction des environnement de développement. Par exemple avec .NET Visual Studio, la création des fichiers de la partie client (stub, ...) se fait de manière totalement transparente pour le développeur (voir partie client C# annexe B-2). Il suffit d'indiquer la localisation du fichier WSDL et l'IDE en déduit automatiquement les services disponibles sous forme de méthodes. Remarque 1: la traduction française de stub et de skeleton est « souche ». Dans d'autres langages ces souches se nomment différemment : • .NET (DCOM) client : proxy serveur : stub • Java (RMI) client : stub serveur : skeleton • Web Services client : service proxy serveur : service implementation template Remarque 2 : Avec Corba, RMI ou DCOM, le principe du stub et skeleton est semblable. Albert Ritch – Les Web Services Page 31 novembre 2003 – v1.0 3.4 UDDI [MAE03] UDDI (Universal Description, Discovery and Integration) est apparu en 2000 sous l'impulsion de trois entreprises : Microsoft, Aribas et IBM. C'est le groupement UDDI Community qui a géré son évolution jusqu'à la version 2 en ralliant de grandes entreprises comme Sun ou HP. C'est dorénavant OASIS, un organisme spécialisé dans les spécifications XML qui va gérer le développement de UDDI. UDDI est la troisième brique des Web Services et offre un moyen de les localiser. En fait, UDDI fait plus que cela. Il est tout d'abord un annuaire général permettant d'avoir de nombreuses informations sur les entreprises répertoriées. Il comporte 3 types de pages qui sont chacune dédiées à de l'information précise. Les pages blanches sont une fiche signalétique comportant des informations générales de l'entreprise (téléphone, contact, mail, ...). Les pages vertes comportent les descriptions techniques de l'entreprise comme l'accès à son service après vente, produits vendus, etc. Les pages jaunes quand à elles référencent les différents Web Services proposés par l'entreprise ainsi que le moyen d'y accéder. 3.4.1 Structure de documents UDDI Fig. 3-5 : Structure de document UDDI BusinessEntity (entité commerciale) Cet élément qui est la racine du document UDDI, décrit le référencement d'un Web Service. Il indique notamment les coordonnées de l'entreprise (nom, adresse mail, description, ...). BusinessService (description des services) Il décrit les Web Services par leur nom, description, catégorie, clé de recherche et liaisons (binding templates). Albert Ritch – Les Web Services Page 32 novembre 2003 – v1.0 BindingTemplate (liaisons) Il regroupe les liens d'accès du Web Service ainsi que le protocole à utiliser. Tmodel (modèles de données) Il inclut des liens vers les fichiers de description (WSDL) du Web Service. 3.4.2 Accès à un annuaire UDDI L'accès aux annuaires UDDI peut se faire de deux manières différentes. Via un browser pour comme tout site Web normal ou par programmation en utilisant les API d'accès comme par exemple UDDI4J qui est une implémentation Java de la spécification UDDI. Accès via un browser Nous allons voir comment accéder à un serveur UDDI, via l'annuaire d'IBM8. Nous allons accéder à un service de météo aux USA. Fig 3-6 : Recherche dans l'annuaire UDDI d'IBM Nous allons rechercher les entreprises (business) portant sur la météo en entrant « weather » dans le champ « Starting with » et cliquer sur « Find ». 8. Addresse : https://uddi.ibm.com/ubr/registry.html Albert Ritch – Les Web Services Page 33 novembre 2003 – v1.0 Fig 3-7 : Résultats de la recherche Une série d'entreprises sont trouvées et nous allons choisir « WeatherService » qui indique la météo aux USA en fonction du code postal. On constate, qu'une série d'informations caractérise l'entreprise. Outre son nom, sa description, ses coordonnées, etc, on constate qu'un fichier WSDL est présent ainsi qu'un code nommé key qui identifie l'entreprise de manière unique. Fig 3-8 : Description de l'entreprise Cette recherche peut se faire avec d'autres outils comme UDDI Browser, un utilitaire inclus dans WSDL Editor (voir plus haut). Chaque service proposé par l'entreprise possède également une clé unique d'identification. Accès via la programmation L'accès via un browser implique obligatoirement un intervention humaine alors qu'il est souvent utile Albert Ritch – Les Web Services Page 34 novembre 2003 – v1.0 d'accéder à un annuaire UDDI de manière automatisée. Pour cela, il faut utiliser une implémentation de l'API OASIS. On peut trouver les spécifications de l'API d'accès à un annuaire UDDI sur le site de l'organisme OASIS9. Tab 3-1 : Les requêtes accessibles prévues dans l'API Fonction But Message retourné find_binding find_business find_relatedBusiness es find_service find_tModel get_bindingDetail get_businessDetail Recherche d'un binding spécifique à partir d'un service business précis. Recherche des informations d'une entitié business Recherche des informations d'une entitié business à partir d'une autre entité business dont la clé d'identification est passée en paramètre Recherche d'un service d'une entité business Recherche d'un service type Recherche d'une liaison d'un service. Recherche les informations d'une entité business d'une entreprise ou organisation get_bindingDetailExt Recherche d'un information étendue sur une entité business get_serviceDetail Recherche des informations détaillées sur une entité business get_tModelDetail Recherche des informations sur un service type bindingDetail businessList relatedBusinessesL ist serviceList tModelList bindingDetail businessDetail businessDetailExt serviceDetail tModelDetail Pour illustrer la programmation de requêtes vers un annuaire UDDI, nous allons utiliser UDDI4J, l'implémentation IBM de l'API UDDI. Nous allons mettre en oeuvre la fonction find_business. Les packages utilisés sont UDDI4J10, xmlParserAPIs, jaxrpc et commons-loggin (voir installation de Axis annexe B1) package meoUddi; import org.uddi4j.client.*; import org.uddi4j.datatype.Name; import org.uddi4j.response.*; import org.uddi4j.transport.TransportFactory; import java.util.Vector; public class UDDIGetBusinessMeo5 { /** Creates new UDDIGetBusinessMeo5 */ public UDDIGetBusinessMeo5() { } public static void main (String args[]) throws Exception { // Création du stub UDDI client à l'aide de la factory UDDIProxy et // .. choix du serveur UDDI System.setProperty(TransportFactory.PROPERTY_NAME, "org.uddi4j.transport.ApacheAxisTransport"); UDDIProxy proxy = new UDDIProxy(); // le point d'entrée pour la demande d'information est celui d'IBM proxy.setInquiryURL("http://www3.ibm.com/services/uddi/inquiryapi"); // nom du Business recherché : Weather // remarque : on peut ajouter des Name au vecteur, par exemple "IBM" ce // .. qui produit la recherche de "Weather" et "IBM" Vector termes = new Vector(); 9. http://uddi.org/pubs/ProgrammersAPI-V2.04-Published-20020719.htm 10. UDDI4J : http://www-124.ibm.com/developerworks/oss/uddi4j Albert Ritch – Les Web Services Page 35 novembre 2003 – v1.0 termes.add(new Name("Weather")); // on pourrait très bien ajouter des noms de recherche au vecteur BusinessList bList = new BusinessList(); bList = proxy.find_business(termes, null, null, null, null, null, 0); // Listing du résultat BusinessInfos bInfos = new BusinessInfos(); bInfos = bList.getBusinessInfos(); if (bInfos.size() == 0) { System.out.println("Aucune entité business trouvée"); } else { System.out.println(bInfos.size() + " entité(s) business trouvée (s) :\n"); Vector temp = bInfos.getBusinessInfoVector(); for (int i = 0; i < bInfos.size(); i++) { System.out.println(((BusinessInfo)temp.elementAt(i)). getDefaultNameString()); System.out.println(" " + ((BusinessInfo)temp.elementAt (i)).getBusinessKey()); System.out.println ("-----------------------------------------"); } // else } // if } // main } // UDDIGetBusinessMeo5 Le résultat retourné liste bien l'entité business que nous avions trouvée plus haut avec le browser. 8 entité(s) business trouvée(s) : Calibre Software Solutions C3C56585-99FF-494D-8EFD-E63C0655DE77 ----------------------------------------Weather Provider 85FC4F5A-AB34-4AB6-97ED-3607E1847840 ----------------------------------------Weather in Powell 811233F0-C677-11D6-883C-000629DC0A53 ----------------------------------------WeatherBusinessTest 92BF57B3-4FFB-4B8E-8102-E84ED794DCAB ----------------------------------------WeatherService 840CCF43-DA21-48C2-AE95-A0D3415B7E5E ----------------------------------------Weatherbee Consulting 90C0E220-32CE-11D6-87CE-000C0E00ACDD ----------------------------------------Weatherly's Technical Writing and Consulting, Inc. (dba) JTWC, Inc. 682738F0-BF78-11D6-905B-000629DC0A53 ----------------------------------------weather 69AEEC70-46FD-11D6-9B35-000C0E00ACDD ----------------------------------------- Albert Ritch – Les Web Services Page 36 novembre 2003 – v1.0 3.4.3 Publication d'un Web Service Les annuaires UDDI peuvent être publics comme celui d'IBM ou privé, par exemple pour une entreprise et ses différents secteurs. Albert Ritch – Les Web Services Page 37 novembre 2003 – v1.0 4. Les Web Services et les protocoles d'applications distribuées Les architectures distribuées actuelles sont toutes inféodées à la spécificité de leur plate-forme. Chaque éditeur proposant des logiciels permettant de créer des architectures distribuées se base sur des protocoles de communication qu'il a créés mais qui sont très souvent incompatibles avec ceux d'autres plates-formes. Par exemple les EJB (Enterprise Java Bean) de Sun ne peuvent communiquer directement avec des logiciels distribués aux normes COM+ de Microsoft. Si la qualité et la puissance des EJB ou de COM+ sont reconnues, ils leur manque un pont technologique afin qu'ils puissent communiquer dans le cas d'architectures distribuées hétérogènes. C'est la raison pour laquelle des technologies intermédiaires comme CORBA ont vu le jour. CORBA a été mis au point par un groupement d'éditeurs dans le but de palier aux problèmes d'interopérabilité. Néanmoins CORBA a ses limites, notamment dues à la complexité de mise en oeuvre et à sa lourdeur. Les Web Services permettent d'apporter une solution à ce problème en permettant notamment de s'affranchir de la contrainte de la plate-forme ou du langage de programmation. Il est alors possible d'utiliser des EJB avec un client écrit avec C#. De même, il sera possible pour un Web Service de faire office de connecteur dans le contexte des EAI. On peut alors légitimement se demander si les Web Services vont remplacer les technologies comme CORBA. Après un panorama des protocoles d'accès à distances nous allons tenter de répondre à cette question. Les Web Services peuvent donc être utilisés, entre autres, dans de nombreux contextes : • • • • EAI (ESB) Applications B2B (Ex : banque et organisme de carte de crédit) Applications client serveur hétérogènes (Ex : client C# et serveur J2EE) Liaison entres serveurs hétérogènes Ce chapitre va aborder l'utilisation des Web Services dans le contexte des architectures distribuées, alors que le chapitre suivant portera sur l'utilisation des Web Services dans les technologies d'intégration (EAI). 4.1 Les protocoles de communication dans les architectures distribuées [OMG03], [SUN03] 4.1.1 RMI RMI (Remote Method Invocation) est une API permettant de communiquer avec des objets distants Java. On parle de RMI/IIOP car RMI se base sur IIOP depuis la version 2 de Java. IIOP est un protocole de communication normalisé par l'OMG et qui est également utilisé par CORBA. Fonctionnement : Lorsque le client désire accéder à des méthodes d'un objet distant il passe par l'intermédiaire du stub qui, comme nous l'avons vu plus haut est une représentation de l'objet distant. Le stub (proxy) sérialise l'invocation de la méthode distante (marshalling) et le skeleton la déserialise au niveau du serveur. Les données (résultat) sont retournées par le chemin inverse. Afin de trouver un service distant, le client utilise un service de nommage (rmiregistry). Albert Ritch – Les Web Services Page 38 novembre 2003 – v1.0 4.1.2 EJB Les EJB (Enterprise Java Bean) sont des objets distribués dans la plate forme J2EE dont l'accès se fait avec RMI. Les EJB sont des composants réutilisables qui s'exécutent dans un conteneur d'EJB. 4.1.3 COM+ COM+ (Component Object Model) est la version Windows de gestion des objets distribués. C'est une version améliorée de COM intégrant en plus la gestion des transaction, la sécurité et un protocole semblable à IIOP de CORBA nommé DCOM. 4.1.4 .NET Remoting Pour pouvoir communiquer avec ses objets distribués, Microsoft à mis au point .NET Remoting qui peut s'apparenter à RMI. Avec .NET Remoting, les données peuvent transiter soit en binaire, soit avec SOAP. 4.1.5 CORBA L'OMG (Object Management Group) est un consortium qui regroupe des acteurs du monde informatique (constructeurs, éditeurs de logiciels, ...). CORBA est globalement un bus logiciel à travers lequel des objets peuvent communiquer. Fig. 4-1 : Requête à un objet distant L'interopérabilité entre bus ORB (inter-ORB) est réalisé à l'aide du protocole IIOP. Il définit donc une architecture client-serveur où les objets sont distribués. CORBA est censé supporter tous les langages de programmation, cependant à l'heure actuelle seuls C, C++, Ada, SmallTalk, Cobol, Ada 95, Perl, Eiffel et Java le sont. 4.1.6 Autres technologies (Janeva) Janeva est un pont technologique qui permet aux applications .NET de communiquer avec les composants J2EE ou CORBA. Cette initiative de Borland qui propose des outils de développement aussi bien pour J2EE que pour .NET, montre le besoin des éditeurs de faire communiquer différentes plates-formes entre-elles. 4.2 CORBA et les Web Services On peut trouver de nombreuse affirmations sur les forums ou sur des sites web qui opposent CORBA Albert Ritch – Les Web Services Page 39 novembre 2003 – v1.0 aux Web Services. Souvent ces affirmations sont sans réel fondement et essaient de démontrer la supériorité de CORBA sur les Web Services ou inversement. Mais qu'en est-il réellement ? Les Web Services vont-ils détrôner CORBA, en devenir complémentaires ou tout simplement devenir une technologie de plus, comme un simple effet de mode ? 4.2.1 Avantage des Web Services par rapport à CORBA Devant l'utilité de faire communiquer des systèmes incompatibles, CORBA a vu le jour. On peut constater le parallèle avec l'introduction des Web Services. Tout comme les Web Services, CORBA est un standard permettant d'être indépendant de plate-formes ou de langages et de nombreuses entreprises soutiennent ce standard. Un langage de définition permet de décrire les objets distants, il s'agit de l'IDL (Interface Definition Language). Par rapport à CORBA, les Web Services présentent une flexibilité et une simplicité de mise en oeuvre très intéressante. De plus, ils ne sont pas forcément liés à la programmation objet, permettant à des langages non objets ou à des éléments de suite bureautique par exemple de consommer des Web Services. De plus, les Web Services sont à l'aise dans le cas d'ouverture vers Internet, car ils sont basés sur HTTP. Néanmoins on peut créer des applications Web avec CORBA en utilisant des applications CGI, ou des servlets par exemple. 4.2.1 Avantages de CORBA CORBA présente des performances supérieures aux Web Services. Ceci peut poser, pour les Web Services, des problèmes importants sur des architectures dont une forte réactivité est indispensable. Randy Heffner11 du Gigagroup met en avant ce problème « If an application requires response time of three seconds or less, one is well advised to examine the situation very closely before committing to Web Services as part of the architecture. It is no surprise that HTTP, Extensible Markup Language (XML) parsing and longer message lengths make Web Services slower than binary protocols such as CORBA and Java remote method invocation (RMI). But when XML’s slowing effect is exacerbated by other factors such as network latency and poor application design, performance can degrade more quickly than anticipated. » On le constate, CORBA prend l'avantage lorsque les performances sont critiques. 4.2.2 CORBA ou les Web Services ? En fait les deux ! Chacune des deux technologies présente des avantages et inconvénients qui les rendent complémentaires. On pourra donc utiliser les Web Service dans les cas d'intégration dans l'entreprise ou CORBA lorsque les performances sont importantes, et utiliser les Web Services dans les échanges de services avec les partenaires (échanges B2B). Malgré les allégations de ses détracteurs, de nombreux cas de réussite on été constatés dans l'implantation de CORBA par des entreprises12. 11. Randi Heffner – Gigagroup : « Web Services Performance: Be Careful When Three Seconds Is Too Slow » 25 juin 2003. 12. Le site suivant : http://www.corba.org/success.htm, présente des cas de « success stories » avec CORBA Albert Ritch – Les Web Services Page 40 novembre 2003 – v1.0 5. Les Web Services et les technologies d'intégration (EAI) [DHE01], [FER01], [CRO102], [JEA01], [01N03], [DHE02] Lors de la multiplication des applications incompatibles en entreprise (ERP, CRM, développement spécifique, ...) les groupes de recherche (Gartner Group, ...) ont constaté que les développements spécifiques des EAI au sein de l'entreprise posent de nombreux problèmes. Par exemple, les projets d'intégration sont très chers à développer et le dépassement en temps est chose fréquente. C'est pourquoi, dès les années 90, les entreprises on fait appel aux produits des éditeurs tels que IBM ou BEA. Néanmoins, ces EAI sont également très chers et complexes à mettre en oeuvre. Des EAI, dits légers, ont fait leur apparition mais sans percer, leur couverture fonctionnelle étant trop faible. C'est au vu de ces problèmes que se profile actuellement une nouvelle génération d'EAI qui se basent sur les technologies récentes dont notamment les Web Services. 5.1 Intégration point à point C'est le premier type d'intégration d'applications apparu. Les types d'intégration évoluent en fonction des besoins de l'entreprise et de la complexité d'intégration des applications. Dans le cas de l'apparition d'un progiciel dans l'entreprise par exemple, l'intégration aux autres applications peut se faire point à point (ou « network centric »). C'est à dire que des connecteurs sont développés spécifiquement pour chaque application, d'une application à l'autre (structure en étoile). L'avantage de ce type d'intégration se présente par des prix réduits et un développement fait à la demande. En revanche, lors d'un nombre trop élevé d'applications ou d'une complexification de l'intégration, il devient vite fastidieux et cher de développer de cette manière. Fig. 5-1 : Intégration point-à-point 5.2 EAI Une autre approche consiste en l'utilisation d'une plate-forme d'intégration sur laquelle les applications sont connectées. On l'appelle broker d'intégration (EAI) et c'est lui qui gère les communications entre les applications connectées. Cette structure facilite grandement l'intégration de nombreuses applications et permet d'en intégrer de nouvelles plus facilement. Par exemple dans le cas d'acquisition d'un progiciel, il suffira simplement d'acquérir un connecteur pour faire la liaison avec l'EAI. On parle d'interopérabilité des applications. Le middleware représente un élément des EAI, à savoir la transmission des données entre les applications. Albert Ritch – Les Web Services Page 41 novembre 2003 – v1.0 Les EAI sont structurés en plusieurs modules : • Les connecteurs Les connecteurs sont chargés de traduire les messages délivrés par le broker de messages à l'application et inversement. • le transport des informations entre les différentes De type « bus », ceci est réalisé par le middleware • le routage Ceci est réalisé par le broker de messages • la gestion des processus (gestion métier) Modélise le cycle de vie des messages gérés par le broker de messages, à savoir le flux interapplicatif • le repository (référentiel) et les règles de routage Consiste en une définitions des données entrant et sortant des applications (méta-données) et étant encapsulées dans les messages. Les règles de routages intervient au niveau du broker de messages • le module d'administration de Le centre de pilotage de l'EAI permettant de gérer et contrôler la sécurité, ... applications des de l'entreprise informations l'EAI Fig 5-2 : Broker d'intégration 5.2.1 Middleware Les middlewares des broker d'intégration sont principalement basés sur les architectures MOM (Middleware Oriented Message) ou ORB (Object Request Broker). Cependant il existe d'autres architectures tels que les RPC (Remote Procedure Call) ou les serveurs d'application Les MOM sont de type asynchrones et peuvent donc stocker les messages jusqu'à ce que l'application destinataire soit disponible. Dans les MOM on peut citer JMS de SUN ou MQ Series d'IBM. En oposition, les architectures de type synchrone relient directement les applications et la réception/renvoi du message est immédiate. Par exemple, les architectures à objets distribués sont de type synchrone. Albert Ritch – Les Web Services Page 42 novembre 2003 – v1.0 5.3 Convergence entre les EAI et le E-business Alors que les EAI traditionnels intègrent les applications dans l'entreprise, les serveurs d'application permettent d'ouvrir l'entreprise vers l'extérieur en proposant des services aux partenaires. Un serveur d'applications connecté à l'EAI, permet de partager les informations entre le système d'information de l'entreprise et ses partenaires. Maintenant que le serveur d'applications est relié au broker d'intégration, on peut se demander quelle sera l'intégration des partenaires avec notre système. C'est là que les Web Services interviennent. Par l'intermédiaire du serveur d'applications relié à au système, ils proposent des services aux partenaires de l'entreprise. Fig. 5-3 : Intégration avec les partenaires Albert Ritch – Les Web Services Page 43 novembre 2003 – v1.0 5.4 ESB (Enterprise Service Bus) [MAU203], [FAR03] Les ESB (Enterprise Service Bus) représentent une nouvelle génération d'EAI. Bâtis autour de standards comme les connecteurs JCA et les Web Services, les ESB ainsi baptisés par le Gartner Group, sont proposés jusqu'à un cinquième du prix des EAI traditionnels. L'avènement des ESB est lié à l'établissement de nouveaux standards tels que .NET, J2EE et les Web Services. Fig. 5-4 : ESB (Enterprise Service Bus) Dans le cas d'EAI traditionnels, il fallait faire appel aux connecteurs propriétaires des entreprises fournissant l'EAI multipliant ainsi les types de connecteurs. Avec les ESB, les connecteurs sont standards. Albert Ritch – Les Web Services Page 44 novembre 2003 – v1.0 6. Plates-formes et outils de développement [BUR203] , [LEO03], [VAW01] Les outils et plates-formes de développement dans la mise en place de Web Services étant très nombreux, il est utile de faire un comparatif des plus importants. On peut distinguer deux principales plates-formes permettant de déployer des Web Services : • La plate-forme J2EE • La plate-forme .NET Il faut également noter que les éditeurs Open Source propose des outils libres pour toutes platesformes confondues. Par exemple, Perl ou PHP disposent maintenant de plusieurs API pour les Web Services (par exemple nuSoap). 6.1 La plate-forme .NET La plate-forme .NET est constituée de plusieurs éléments dont : • le framework .NET qui est le pilier de base de la plate-forme • l'environnement de développement Visual Studio • les architectures serveur (Windows Server 2003) Fig. 6-1 : La plate-forme .NET Comme on peut le constater (voir fig 6-1), le framework .NET peut supporter de nombreux langages grâce à la CLR qui est une machine virtuelle ressemblant à celle de SUN. Un langage intermédiaire, le byte-code est interprété à la volée par la machine virtuelle. Albert Ritch – Les Web Services Page 45 novembre 2003 – v1.0 Les Web Services sont bien intégrés dans le framework .NET. En effet, Microsoft s'est très vite investi dans les Web Services, comme on a pu le voir précédemment. Fig. 6-2 : Architecture des Web Services avec .NET Peu d'éditeurs proposent d'IDE de développement pour la plate-forme .NET. Seul Borland, l'éditeur dont la réputation n'est plus à faire, propose C# Builder, un IDE permettant de développer en C#. On peut également citer une initiative intéressante de la communauté Open Source qui consiste en une implémentation du framework de développement .NET sous Linux portant le nom de projet Mono13. 13. Projet Mono : http://www.go-mono.com/ Albert Ritch – Les Web Services Page 46 novembre 2003 – v1.0 6.3 Plate-forme J2EE SUN s'est intéressé relativement tard dans les Web Services. En effet, SUN a été peu motivé d'adopter des standards proposés, en majorité, par ses concurrents. Même si SUN à doté sa plate forme d'outils performants (JWSDP) c'est en retard par rapport aux offres Microsoft qu'ils ont apparus. Fig. 6-3 : Plate-forme J2EE Actuellement les Web Services sont bien intégrés dans J2EE. Ils s'appuient à l'heure actuelle sur les servlets, mais les EJB devraient bientôt être utilisables directement en tant que Web Services. L'offre de SUN pour la création et le déploiement de Web Services consiste en un serveur d'applications, Sun One Server, et un IDE, Sun One Studio. Cependant de nombreux concurrents de SUN proposent des outils semblables qui respectent la norme J2EE. On peut citer IBM avec WebSphere Application Server et WebSphere Studio, BEA avec WebLogic Server et WebLogic Workshop, Borland avec Enterprise Server et Borland JBuilder, etc. Le monde Open Source apporte également ses solutions comme les serveurs d'application J2EE JBoss et JOnAS ainsi que les IDE de développement Eclipse et NetBeans. Une contribution également importante du monde Open Source est Tomcat, un serveur d'applications proposant un conteneur de servlets. Albert Ritch – Les Web Services Page 47 novembre 2003 – v1.0 Fig. 6-4 : Architecture des Web Services avec J2EE Albert Ritch – Les Web Services Page 48 novembre 2003 – v1.0 6.3 Récapitulatif des outils pour la mise en oeuvre des Web Services Les outils de mises en oeuvre sont très nombreux. En effet presque chaque entreprise propose ses outils. Tab 6-1 : Outils de mise en oeuvre de Web Services Type composant Serveurs d'applications deJ2EE .NET WebSphere application server Framework .NET (IBM) Sun One Server (SUN) Open Source ou autre JBoss (implémentation J2EE) Jonas (implémentation J2EE) Enhydra (implémentation J2EE) WebLogic Server (BEA) Tomcat (Apache – JSP, Servlets) Oracle 9iAS (Oracle) Mono (implémentation libre et open source de .NET) Enterprise Server 5.1 (Borland) Environnements d'exécution JVM CLR Utilisation de la JVM, CLR ou autre Environnements complets de développement intégrant le développement de Web Services XDE (IBM) Visual Studio .NET (Microsoft) Eclipse (J2EE) Sun One Standard Edition (SUN) JBuilder (Borland) WebSphere Studio (IBM) JWSDP (Java Web Services API pour le Developer Pack) développement de Web Services (client ou serveur) C# Builder (Borland .NET) NetBeans (J2EE) Delphi (Non libre - Borland) Kylix (Non libre – Borland) Matrix (Outil gratuit de Microsoft pour le Mono (.NET) développement de site en ASP.NET) Microsoft Soap Toolkit (.NET) Axis (Java) NuSoap (PHP) Soaplite (Perl) JWSDP (Non libre - Java Web Services Developer Pack) 6.1.1 API pour le développement de Web Services (client ou serveur) Les API proposées par les éditeurs de solutions Web Services, sont généralement incluses dans leurs environnements de développements (IDE). Voici le détail de quelques API proposées par de grands éditeurs. JWSDP ( Java Web Services Developer Pack) : [HAN03] Cette API proposée par SUN se compose des éléments suivants : JAXP (Java API for XML Processing) API Java permettant de parser des documents XML au moyen d'API DOM ou SAX (Xerces-J en est une implémentation) JAXB (Java Architecture for XML Binding) API Java servant à automatiser la conversion d'objets Albert Ritch – Les Web Services Page 49 novembre 2003 – v1.0 Java en XML et inversement. JAXB se fonde sur les W3C XML Shema pour définir la structure des documents XML. Le traitement d'un document XML avec JAXB aboutit à la création d'objets java auxquels il suffit d'accéder pour manipuler les informations du document XML. JAXR (Java API for XML Registries) API permettant l'accès à des registres standards (UDDI) JAX-RPC (Java API for Xml-based RPC) API Java pour appels RPC avec XML JAXM (Java API for XML Messaging) API Java permettant d'écrire et d'envoyer des messages XML via Internet JSTL (Java Standard Tag Library) Ensemble de tags proposant des fonctionnalités similaires aux JSP JSSE (Java Secure Socket Extension) Package permettant de faire communiquer un client Java avec un serveur HTTPS (HTTP sécurisé) SAAJ (SOAP with Attachments API for Java) API permettant l'envoi et la réception de messages respectant la spécification SOAP et SOAP with Attachment Outils compris dans le pack : • Apache Tomcat • Java WSDP Registry Server (serveur UDDI) • Web application development tool • Apache Ant (cf. make pour C++) Axis Axis est un ensemble d'outils libres permettant de créer et de déployer des Web Services. Couplé avec Tomcat, il permet de délivrer des Web Services à partir de servlets. Il propose des utilitaires permettant de générer les fichiers utiles pour le client, serveur, ainsi que pour le déploiement du Web Service. Il s'agit notamment de : java2WSDL Il permet de créer le fichier de description WSDL correspondant à l'interface du Web Service. WSDL2Java Il permet de générer automatiquement, à partir d'un document WSDL, un fichier Java qui encapsule les appels au Web Service. Les fichiers créés sont détaillés dans le chapitre 3.3 dédié à WSDL. Il est à noter que les utilitaires WSDL2Java et Java2WSDL existent en tant que plug-in pour Eclipse. Axis est une évolution de Apache SOAP qui lui-même a été développé à partir des utilitaires SOAP4J et WSDL4J offerts au groupe Apache par IBM. Albert Ritch – Les Web Services Page 50 novembre 2003 – v1.0 Microsoft SOAP Toolkit Cette API permet de développer des clients de Web Services en VBA (Visual Basic for Applications). Il est donc possible de rendre un logiciel de la suite Office cliente d'un Web Service. UDDI4J Cette API, proposée par IBM, permet d'accéder via la programmation à un annuaire UDDI. Il permet d'exécuter des requêtes de recherche ou de publication d'un Web Service. NusOAP NuSOAP est une API destinée à PHP. PHP étant un langage très populaire de scripts pour le Web, les nombreux développeurs l'utilisant vont pouvoir développer et consommer des Web Services via cette API. Les browser Web Les browsers phares du marché peuvent maintenant directement accéder à des Web Services en tant que clients. A l'aide de JavaScript et des composants spécifiques qu'ils intègrent, ils évitent de passer par un serveur de scripts. Il suffit alors d'écrire une page Web locale qui intègre les appels aux Web Services codés avec JavaScript. Albert Ritch – Les Web Services Page 51 novembre 2003 – v1.0 Annexe A : Installation et configuration de Tomcat et d'Axis [ROU02], [ROU03] A.1. Obtenir les softwares Remarque : les fichiers ci-dessous sont utilisables sous Windows et Linux. Axis Download d'Axis http://ws.apache.org/axis/ Version utilisée dans les mises en oeuvre : version 1.1 Tomcat Download de Tomcat http://jakarta.apache.org/site/binindex.cgi Version utilisée dans les mises en oeuvre : version 4.1.27 Lien direct du package http://sunsite.cnlab-switch.ch/www/mirror/apache/dist/jakarta/tomcat-4/tomcat-4.1.27.zip A.2. Installation et configuration de Tomcat Tomcat est un serveur d'applications faisant partie du projet Jakarta initié par le groupe Apache. Tomcat n'implémente pas complètement les spécifications J2EE mais uniquement les spécifications des JSP (Java Server Pages) ainsi que des servlets. Remarque : L'installation suivante de Tomcat (puis de Axis au point 3) est l'installation au niveau serveur. Comme pré requis il faut un JDK installé sur le serveur hébergeant Tomcat (jdk 1.3.0 ou supérieur). Puis, downloader Tomcat sur le site du projet Jakarta du groupe Apache et le décompresser dans un répertoire (ici : d:\users\tomcat-4.1.27). A.2.1 Lancement et arrêt de Tomcat : Afin de préciser les variables d'environnement locales telles que la JVM et l'emplacement de Tomcat, on peut créer des fichier batch de lancement / d'arrêt pour Tomcat. On peut placer ces fichiers dans le répertoire de Tomcat (d:\users\tomcat-4.1.27). A.2.1.1 Fichier de lancement Créer un fichier batch (.bat) nommé tomcatStartup.bat et y insérer les lignes suivantes : set JAVA_HOME=d:\java\jdk1.3.1 set TOMCAT_HOME=d:\users\tomcat-4.1.27 @%TOMCAT_HOME%\bin\startup Sous Linux : (tomcatStartup.sh) #! /bin/sh # startup.sh echo "------- Définition des chemins ---------" TOMCAT_HOME=/home/al/jakarta-tomcat-4.1.27 export TOMCAT_HOME echo "------- Lancement d'Axis ---------" $TOMCAT_HOME/bin/startup.sh Albert Ritch – Les Web Services Page 52 novembre 2003 – v1.0 A.2.1.2 Fichier d'arrêt Créer un autre fichier batch nommé tomcatShutdown.bat et y insérer les lignes suivantes : @%TOMCAT_HOME%\bin\shutdown Sous Linux (tomcatShutdown.sh) : $TOMCAT_HOME/bin/shutdown.sh A.2.1.3 Test du fonctionnement Pour vérifier que Tomcat est bien installé et fonctionne correctement, lancer le fichier tomcatStartup.bat et ouvrir l'URL suivante dans un browser : http://localhost:8080 La page suivante devrait apparaître : Fig. A-1 : Page de démarrage de Tomcat Albert Ritch – Les Web Services Page 53 novembre 2003 – v1.0 A.3. Installation et configuration d'Axis Télécharger Axis et le décompresser dans un répertoire temporaire. Axis contient un sous-répertoire webapps qui contient un autre sous-répertoire nommé axis. Décompresser ce sous-répertoire et le placer dans le répertoire TOMCAT_HOME\webapps Copier le fichier TOMCAT_HOME\common\endorsed\xercesImpl.jar TOMCAT_HOME\webapps\axis\WEB-INF\lib dans le répertoire Ajouter au fichier tomcatStartup.bat les lignes en rouge afin de mettre à jour le CLASSPATH en tenant compte de Axis : set JAVA_HOME=d:\java\jdk1.3.1 set TOMCAT_HOME=d:\users\tomcat-4.1.27 set AXIS_HOME=%TOMCAT_HOME%\webapps\axis set AXIS_LIB=%AXIS_HOME%\WEB-INF\lib set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\axis.jar set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\commons-discovery.jar set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\commons-loggin.jar set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\jaxrpc.jar set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\saaj.jar set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\log4j-1.2.8.jar set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\xml-apis.jar set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\xercesImpl.jar set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\xmlParserAPIs.jar @%TOMCAT_HOME%\bin\startup Sous Linux (tomcatStartup.sh) : #! /bin/sh # startup.sh echo "------- Définition des chemins ---------" TOMCAT_HOME=/home/al/jakarta-tomcat-4.1.27 export TOMCAT_HOME AXIS_HOME=$TOMCAT_HOME/webapps/axis; export AXIS_HOME AXIS_LIB=$AXIS_HOME/WEB-INF/lib; export AXIS_LIB CLASSPATH=$CLASSPATH:AXIS_LIB/axis.jar CLASSPATH=$CLASSPATH:AXIS_LIB/axis-ant.jar CLASSPATH=$CLASSPATH:AXIS_LIB/commons-discovery.jar CLASSPATH=$CLASSPATH:AXIS_LIB/commons-logging.jar CLASSPATH=$CLASSPATH:AXIS_LIB/jaxrpc.jar CLASSPATH=$CLASSPATH:AXIS_LIB/saaj.jar CLASSPATH=$CLASSPATH:AXIS_LIB/log4j-1.2.8.jar CLASSPATH=$CLASSPATH:AXIS_LIB/wsdl4j.jar CLASSPATH=$CLASSPATH:AXIS_LIB/xercesImpl.jar CLASSPATH=$CLASSPATH:AXIS_LIB/xmlParserAPIs.jar export CLASSPATH echo "------- Lancement d'Axis ---------" $TOMCAT_HOME/bin/startup.sh A.3.1 Lancement et arrêt de Axis Arrêter puis redémarrer Tomcat avec les nouveaux paramètres que nous venons d'ajouter. Pour vérifier que Axis soit bien installé, ouvrir l'URL suivante avec un browser : http://localhost:8080/axis Albert Ritch – Les Web Services Page 54 novembre 2003 – v1.0 La page suivante devrait apparaître : Fig. A-2 : Fenêtre de démarrage d'Axis En affichant la page http://localhost:8080/axis/happyaxis.jsp, on va pouvoir vérifier que toutes les bibliothèques nécessaires sont installées. A.4. Installation de Axis (API) au niveau client Afin de pouvoir créer des clients de Web Services avec Java, on utilise l'API Axis au niveau client. Cette API consiste en une série de packages (.jar) qu'il faut importer dans les classes clientes. Ces packages se situent dans le répertoire axis-1_1\webapps\axis\WEB-INF\lib de l'archive Axis téléchargée auparavant (voir point 1). Copier simplement ces packages (ici dans le répertoire p:\_travailDiplome\travailDiplome\code\axis) puis ajouter leur localisation au classpath local. Pour automatiser la mise à jour du classpath local, on peut créer un fichier batch qui comprend les lignes suivantes : @echo off set JAVA_HOME=d:\java\jdk1.3.1 set PATH=%PATH%;%JAVA_HOME%\bin set AXIS_HOME=p:\_travailDiplome\travailDiplome\code\axis set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\axis.jar set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\axis-ant.jar set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\commons-discovery.jar set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\commons-logging.jar set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\jaxrpc.jar set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\log4j-1.2.8.jar set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\saaj.jar set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\wsdl4j.jar Albert Ritch – Les Web Services Page 55 novembre 2003 – v1.0 set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\xerces.jar set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\xmlParserAPIs.jar set CLASSPATH=.;%CLASSPATH%;p:\_travailDiplome\travailDiplome\code Ce fichier sera placé dans notre cas dans : P:\_travailDiplome\travailDiplome\code\classpath\axisClientSetClasspath.bat Sous Linux (setClasspath.sh) : #/bin/sh # setClasspath.sh AXIS_HOME=/data/icks/_travailDiplome/travailDiplome/code/axis export AXIS_HOME CLASSPATH=$CLASSPATH:$AXIS_HOME/axis.jar CLASSPATH=$CLASSPATH:$AXIS_HOME/axis-ant.jar CLASSPATH=$CLASSPATH:$AXIS_HOME/commons-discovery.jar CLASSPATH=$CLASSPATH:$AXIS_HOME/commons-logging.jar CLASSPATH=$CLASSPATH:$AXIS_HOME/jaxrpc.jar CLASSPATH=$CLASSPATH:$AXIS_HOME/log4j-1.2.8.jar CLASSPATH=$CLASSPATH:$AXIS_HOME/saaj.jar CLASSPATH=$CLASSPATH:$AXIS_HOME/wsdl4j.jar CLASSPATH=$CLASSPATH:$AXIS_HOME/xerces.jar CLASSPATH=$CLASSPATH:$AXIS_HOME/xmlParserAPIs.jar CLASSPATH=$CLASSPATH:/data/icks/_travailDiplome/travailDiplome/code/ export CLASSPATH A-5 Installation de Sun One Server Une version d'évaluation (à 60 jours) de Sun One Server est mise à disposition par SUN sur son site : http://wwws.sun.com/software/download/app_dev.html Télécharger le package comprenant Sun One Server et Sun One Studio. Télécharger également le Java2SDK Enterprise Edition version 1.4.2. Installer le Java2SDK puis le package comprenant Sun One Server et Sun One Studio. Albert Ritch – Les Web Services Page 56 novembre 2003 – v1.0 Annexe B : Mises en oeuvres B.1. Déploiement d'un Web Service simple Pour cette première mise en oeuvre nous allons mettre en place un Web Service très simple. En effet, Axis permet deux types de déploiement dont un déploiement simple ou il suffit de copier la classe Java utilisée en changeant son extension en .jws. Pré requis : • Tomcat et Axis sont installés (voir Annexe A – Installation de Tomcat et Axis) • Tomcat est lancé Remarque : Cet exemple est conforme aux chemins d'installation de Tomcat et Axis vu à l'annexe A. Au niveau serveur Nous allons prendre l'exemple Calculator.java qui se trouve dans le répertoire axis\samples\userguide\example2 et directement le mettre dans le répertoire d:\users\tomcat4.1.27\webapps\axis en changeant son extension en .jws (java web service). On a donc : d:\users\tomcat-4.1.27\webapps\axis\Calculator.jws Axis compile automatiquement les classes portant l'extension .jws. La classe Calculator devient donc un Web Service dont les méthodes publiques sont à disposition des clients. Au niveau client Au niveau client, nous avons besoin uniquement des bibliothèques contenues dans le répertoire lib de axis (axis.jar, saaj.jar, ...). En fait Axis transforme les requêtes faites au serveur de Web Services. Nous allons utiliser la classe client CalcClient.java (située au même endroit que Calculator.java) et paramétrer l'adresse du serveur à la place de localhost. Sous Windows Ouvir un shell et se positionner sous : P:\_travailDiplome\travailDiplome\code Lancer le fichier de configuration du classpath de Axis : classpath/setClasspath Sous Linux Ouvrir un shell et se positionner sous : /data/icks/_travailDiplome/travailDiplome/code/ Lancer le fichier de configuration du classpath de Axis : . meo1/setClasspath.sh Remarque : pour pouvoir profiter du classpath dans la session courant que nous avons ouverte, utiliser ". " et non pas "./" ce qui évite que le classpath soit configuré dans un processus fils. Compiler la classe CalcClient.java : javac meo1/CalClient.java Exécuter CalcClient avec les arguments : Albert Ritch – Les Web Services Page 57 novembre 2003 – v1.0 java meo1/CalcClient add 4 4 On obtient bien : Fig. B-1 : Mise en oeuvre 1 : exécution de CalcClient Albert Ritch – Les Web Services Page 58 novembre 2003 – v1.0 B.2 Déploiement d'un service de convertisseur de devises [MIC02] La mise en oeuvre précédente est très simple mais ne permet pas le déploiement de Web Services à partir de classes compilée ou de packages (jar). Pour déployer un Web Service sous Axis, il faut utiliser un descripteur de déploiement WSDD (Web Service Deployment Descriptor) propre à Axis qui est utilisé lors du déploiement. Il s'agit d'un fichier XML portant l'extension wsdd. B.2.1 Introduction Au niveau serveur Le Web Service que nous allons mettre en oeuvre utilisera Axis au niveau serveur. Nous allons utiliser également : java2WSDL utilitaire permettant de générer le fichier de description du Web Service (WSDL) à partir de l'interface Java de la classe que nous allons déployer. WSDL2Java utilitaire qui va nous permettre de créer les stub et skeleton ainsi que les fichiers de déploiement deploy.wsdd et undeploy.wsdd tcpmon utilitaire se plaçant entre le client et le serveur qui permet de voir les messages SOAP échangés (déboguage, ...) Voir le chapitre portant sur WSDL ou le résultat de l'invocation de ces utilitaires est détaillé. Remarque : pour invoquer ces diverses commandes, on va se placer dans le répertoire code, et créer le répertoire meo2 dans lequel va se trouver la classe que nous voulons déployer et les fichiers générés. Au niveau client Nous allons utiliser au niveau client le MS SOAP Toolkit v2.0 qui fait partie de Visual Studio .NET, mais qui peut être téléchargé individuellement. Pour coder le fichier VBA, on peut utiliser un éditeur de texte conventionnel ou l'éditeur VBA compris dans toute application MSOffice (Excel par exemple). B.2.2 Mise en place du Web Service 1. Création de la classe java que nous voulons déployer La classe Java que nous allons déployer contient deux méthodes : public double enFranc(double euro) public double enEuro(double franc) Remarque : il faut que les méthodes soient publiques afin de pouvoir y accéder. La classe en question : package meo2; public class Exchange { /** Creates new Exchange */ Albert Ritch – Les Web Services Page 59 novembre 2003 – v1.0 public Exchange() { } /** * Conversion d'Euro en Francs * @param euro Le montant en Euro * @return Le montant en Francs */ public double enFranc(double euro) { return euro * 6.55957; } /** * Conversion de franc en Euro * @param francs Le montant en franc * @return Le montant en Euro */ public double enEuro(double franc) { return franc / 6.55957; } } 2. Créer le fichier WSDL de description du Web Service. L'outil qui nous permet de créer le fichier WSDL est Java2WSDL En invoquant dans la ligne de commande : java org.apache.axis.wsdl.Java2WSDL on obtient les options disponibles avec la commande : Albert Ritch – Les Web Services Page 60 novembre 2003 – v1.0 Fig B-2 : Mise en oeuvre 2 : exécution de Java2WSDL Pour invoquer cette commande, il faut d'abord avoir configuré le classpath (voir B1) en lançant le fichier (depuis le répertoire code) : . classpath/setClasspath.sh Remarque : la configuration du classpath peut être automatisée sous Linux en complétant le fichier .bash_profile et sous Windows en utilisant l'utilitaire de configuration des variables d'environnement. Pour créer le fichier WSDL, invoquer : java org.apache.axis.wsdl.Java2WSDL -o Exchange.wsdl l"http://192.168.1.33:8080/axis/services/Exchange" -n urn:Exchange -p"meo2" urn: meo2.Exchange Options : -o spécification du fichier de sortie -l localisation de notre Web Service -n -p path pour déterminer où se trouve le fichier source Erreurs possibles : The <class-of-portType> was not specified. Î ne pas mettre urn ... entre guillemets On constate alors que le fichier Exchange.wsdl a été généré et se trouve dans le répertoire courant. Albert Ritch – Les Web Services Page 61 novembre 2003 – v1.0 3. Création des fichiers de déploiement et éventuellement stub et skeleton WSDL2Java permet de générer le fichier de déploiement (wsdd) et le skeleton pour le serveur ainsi que le stub (pour un éventuel client Java). Au niveau client, il permet de créer une encapsulation de l'appel du Web Service afin de rendre le codage de la partie client simple. Une interface correspondant à notre classe Exchange.java va être également générée sous le même nom et donc écraser notre classe. Renommer donc notre classe Exchange.java en Exchange.java.orig Puis utiliser WSDL2Java en invoquant : [al@galeon code]$ java org.apache.axis.wsdl.WSDL2Java -o . --skeletonDeploy true -p meo2 Exchange.wsdl Options : -o --skeletonDeploy true -p où se trouve le fichier wsdl force la génération du skeleton path où mettre les fichiers On constate alors que les 8 fichiers ont été générés (voir le chapitre 3.3 portant sur WSDL pour leur description) : deploy.wsdd undeploy.wsdd ExchangeService.java ExchangeServiceLocator.java ExchangeSoapBindingImpl.java ExchangeSoapBindingSkeleton.java ExchangeSoapBindingStub.java Modifier le fichier ExchangeSoapBindingImpl.java (modifications en rouge) : package meo2; public class ExchangeSoapBindingImpl implements meo2.Exchange{ public double enFranc(double euro) throws java.rmi.RemoteException { return euro * 6.55957; } public double enEuro(double franc) throws java.rmi.RemoteException { return franc / 6.55957; } Et enfin, compiler tous les fichiers : [al@galeon code]$ javac meo2/*.java 4. Déploiement du Web Service Créer un répertoire meo2 dans le répertoire Axis (serveur) : file:/home/al/jakarta-tomcat-4.1.27/webapps/axis/WEB-INF/classes On a donc maintenant le répertoire file:/home/al/jakarta-tomcat-4.1.27/webapps/axis/WEB-INF/classes/meo2 Copier les fichiers suivants dans le répertoire créé: ExchangeSoapBindingSkeleton.class ExchangeSoapBindingImpl.class Albert Ritch – Les Web Services Page 62 novembre 2003 – v1.0 ExchangeService.class Exchange.class Déploiement du Web Service : [al@galeon code]$ java org.apache.axis.client.AdminClient meo2/ws/deploy.wsdd Relancer Axis (=> Tomcat) => shutdown puis startup On constate bien que le Web Service est déployé : Fig B-3 : Notre Web Service est déployé On peut également constater que l'URL du fichier WSDL est : http://192.168.1.33:8080/axis/services/Exchange?wsdl B.2.2 Création du client en VBA Télécharger et installer MSSOAP Toolkit 2.0 : Téléchargement du Microsoft Office XP Web Services Toolkit 2.0 - Français http://www.microsoft.com/downloads/details.aspx?FamilyID=4922060f-002a-4f5b-af74978f2cd6c798&DisplayLang=fr Créer un fichier source VBA (avec Excel par exemple) nommé client.vbs Option Explicit Dim soapClient Set soapClient = CreateObject("MSSOAP.SoapClient") On Error Resume Next Call Albert Ritch – Les Web Services Page 63 novembre 2003 – v1.0 soapClient.mssoapinit("http://192.168.1.33:8080/axis/services/Exchange?wsdl ") If Err <> 0 Then wscript.echo "initialization failed " + Err.Description End If wscript.echo soapClient.enFranc(10) If Err <> 0 Then wscript.echo wscript.echo wscript.echo wscript.echo wscript.echo End If Err.Description "faultcode=" + soapClient.faultcode "faultstring=" + soapClient.faultstring "faultactor=" + soapClient.actor "detail=" + soapClient.detail wscript.echo soapClient.enEuro(100) If Err <> 0 Then wscript.echo wscript.echo wscript.echo wscript.echo wscript.echo End If Err.Description "faultcode=" + soapClient.faultcode "faultstring=" + soapClient.faultstring "faultactor=" + soapClient.actor "detail=" + soapClient.detail Remarque : Il suffit du fichier WSDL pour que le MSSOAP Toolkit puisse utiliser le Web Service. Lancer le client avec : cscript client.vbs Et on obtient : Fig B-4 : Résultat de l'exécution du client Albert Ritch – Les Web Services Page 64 novembre 2003 – v1.0 B.2.3 Intégration dans MS Office A partir du client VBA, on peut utiliser le Web Service directement à partir d'un élément de la suite MS Office. Nous allons utiliser Excel. 1. Intégration en tant que macro VBA dans Excel Créer un nouveau document Excel et y intégrer un bouton nommé btFrancsEuro. Nommer la cellule B9 « don » et la cellule B11 « res ». Se mettre en mode édition et double cliquer sur le bouton afin d'afficher l'éditeur VBA. Renommer la feuille 1 en « Interface » et créer un module nommé « Convertisseur » comme dans la figure B-6. Fig. B-5 : Création de la feuille Excel Albert Ritch – Les Web Services Page 65 novembre 2003 – v1.0 Compléter le module avec le code suivant : Option Explicit Dim soapClient Private Sub CnxWs() Set soapClient = CreateObject("MSSOAP.SoapClient") On Error Resume Next Call soapClient.mssoapinit("http://192.168.1.33:8080/axis/services/Exchange?wsdl ") If Err <> 0 Then MsgBox ("initialization failed " + Err.Description) End If End Sub 'wscript.echo soapClient.enEuro(10) Sub CalcEuro(donnee As Long) CnxWs Interface.Range("res").Value = soapClient.enEuro(donnee) If Err <> 0 Then MsgBox (Err.Description) MsgBox ("faultcode=" + soapClient.faultcode) MsgBox ("faultstring=" + soapClient.faultstring) MsgBox ("faultactor=" + soapClient.actor) MsgBox ("detail=" + soapClient.detail) End If End Sub Commentaires : Création du client pour le Web Service Fig B-6 : Editeur VBA Albert Ritch – Les Web Services Page 66 novembre 2003 – v1.0 Set soapClient = CreateObject("MSSOAP.SoapClient") Récupération du fichier de description WSDL. Call soapClient.mssoapinit("http://192.168.1.33:8080/axis/services/Exchange?wsdl") Compléter la feuille « Interface » avec le code suivant : Private Sub btFrancsEuro_Click() Convertisseur.CalcEuro Interface.Range("don").Value End Sub Fig B-7 : Résultat après invocation du Web Service En insérant une valeur en Francs dans la cellule B9 et en cliquant sur le bouton on obtient la conversion par le Web Service en Euro dans la cellule B11. 2. Intégration en tant que fonction Excel Il est également possible d'intégrer simplement le Web Service en tant que fonction dans Excel. Ceci permet donc à un utilisateur qui n'a pas de connaissances de VBA d'utiliser le Web Service en toute transparence. Pour cela, il faut modifier le code VBA en le transformant en fonction : Option Explicit Dim soapClient Private Sub CnxWs() Set soapClient = CreateObject("MSSOAP.SoapClient") Albert Ritch – Les Web Services Page 67 novembre 2003 – v1.0 On Error Resume Next Call soapClient.mssoapinit("http://192.168.1.33:8080/axis/services/Exchange?wsdl ") If Err <> 0 Then MsgBox ("initialization failed " + Err.Description) End If End Sub Public Function EnEuro(donnee As Long) As Long Dim temp As Long CnxWs temp = soapClient.EnEuro(donnee) If Err <> 0 Then MsgBox (Err.Description) MsgBox ("faultcode=" + soapClient.faultcode) MsgBox ("faultstring=" + soapClient.faultstring) MsgBox ("faultactor=" + soapClient.actor) MsgBox ("detail=" + soapClient.detail) End If EnEuro = temp 'résultat retourné par la fonction End Function La fonction sera alors automatiquement intégrée dans les fonctions personnalisées d'Excel. Fig. B-8 : Utilisation du Web Service en tant que fonction On constate bien (Fig B-6) que la fonction (EnEuro) fait bien partie des Fonctions personnalisées. Il suffit seulement de chercher la fonction dans la liste, ou la taper directement dans la barre des fonction (Fig. B-7). Albert Ritch – Les Web Services Page 68 novembre 2003 – v1.0 Fig. B-9 : Création de la feuille Excel Albert Ritch – Les Web Services Page 69 novembre 2003 – v1.0 B.3 Client C# avec Visual Studio Pour faire un client C# pour notre Web Service (voir B.2), il faut tout d'abord installer Visual Studio . Net de Microsoft. Attention : certains pré-requis sont nécessaires, comme un service-pack récent. Créer un nouveau projet Windows (C#). Ajouter une référence au Web Service en cliquant avec le bouton droit sur le répertoire « Références ». Fig. B-10 : Ajout du Web Service Insérer l'URL du fichier WSDL du Web Service : Fig B-11 : Recherche du fichier de description WSDL Puis cliquer sur « Aller à ». Albert Ritch – Les Web Services Page 70 novembre 2003 – v1.0 Les méthodes trouvées sont alors listées. Fig B-12 : Les méthodes sont trouvées Il faut maintenant créer l'interface graphique pour notre client. Fig. B-13 : Interface graphique en C# Nommer les labels : lbFr et lbEur Nommer les champs de saisie : tfFr et tfEur Albert Ritch – Les Web Services Page 71 novembre 2003 – v1.0 Nommer le bouton : btCalc Double-cliquer sur le bouton afin de voir apparaître le code correspondant au click et ajouter : private void btCalc_Click(object sender, System.EventArgs e) { double valeur; t1.ExchangeService.ExchangeService Calculateur = new t1.ExchangeService.ExchangeService(); valeur = Calculateur.enEuro(double.Parse(tbFr.Text)); tbEur.Text = valeur.ToString(); } Il faut alors compiler le projet et lancer l'exécutable. Mettre une somme en francs et en cliquant sur « Calculer ». Fig. B-14 : Résultat Albert Ritch – Les Web Services Page 72 novembre 2003 – v1.0 B-5 Scénario de e-banking [SUN103] Dans cette mise en oeuvre, un logiciel de e-banking (très simplifié) en C# va utiliser les services d'un prestataire d'informations (comme Reuters) ainsi que les services d'une banque pour passer les ordres d'achat de titres. Le scénario sera implanté en deux phases. Tout d'abord il s'agira d'implanter la partie serveur du prestataire d'informations boursières et de créer une fenêtre servant à afficher les titres reçus. Ensuite, la partie bancaire sera implantée, permettant de choisir un titre dans la liste de la fenêtre et de passer un ordre d'achat. Reuters Sun One Server Banque GBS Axis Fat client C# Fig. B-15 : Schéma du scénario Albert Ritch – Les Web Services Page 73 novembre 2003 – v1.0 B-5.1 Création du Web Service d'informations bancaires La première partie consiste à créer le Web Service d'informations bancaires sous Sun One Server avec Sun One Studio. Pour l'installation de Sun One Server, se référer à l'annexe A-5. Comme on peut le voir ci-dessous, les classes métier consistent en une classe Bourse et une classe Titre inclues dans un package nommé ReutersServeur. Fig B-16 : Classes serveur Reuters Voici un extrait de la classe bourse. La méthode getTitre permet de retourner un tableaux d'objets comportant les attributs du titre demandé. La méthode getNbTitres retourne quand à elle le nombre de titres présent dans la bourse. Nous allons donc déployer les méthodes getNbTitres et getTitre comme Web Services. package ReutersServeur; public class Bourse { ... public int getNbTitres() { return titres.size(); } public Object[] getTitre(int i) { Object[] titre = new Object[8]; titre[0] = new Integer(((Titre)titres.elementAt(i)).getCode()); titre[1] = new String(((Titre)titres.elementAt(i)).getNom()); titre[2] = new String(((Titre)titres.elementAt(i)).getAbrev()); titre[3] = new Double(((Titre)titres.elementAt(i)).getValeur()); titre[4] = new Double(((Titre)titres.elementAt(i)).getBid()); titre[5] = new Double(((Titre)titres.elementAt(i)).getAsk()); titre[6] = new Integer(((Titre)titres.elementAt(i)).getVolume()); return titre; } } Albert Ritch – Les Web Services Page 74 novembre 2003 – v1.0 Création du Web Service Reuters 1. Compiler le packages puis, pour créer un nouveau Web Service à partir du package Reuters, cliquer dessus et dans le menu déroulant cliquer sur « Web Service ». Fig. B-17 : Plate-forme J2EE 2. Sur la fenêtre qui s'affiche, mettre un nom pour le Web Service. Cliquer sur « Java Methods » ainsi que sur « Web Centric ». 3. Cliquer sur « Next > » et sélectionner les deux méthodes (getNbTitres et getTitre) après avoir déroulé l'arborescence de la classe Bourse.java. Un nouvel élément apparaît avec l'extension xms. Il s'agit du Web Service créé. 4. Cliquer ensuite sur le Web Service (ReutersSMX.xms) avec le bouton droit de la souris et cliquer sur « Generate Web Service Files » (voir fig. B-18). Fig B-18 : Génération du Web Service Comme on peut le constater (fig. B-19) les fichiers nécessaires au Web Service sont créés. Albert Ritch – Les Web Services Page 75 novembre 2003 – v1.0 Fig. B-19 : Package ReutersServeur Déploiement du Web Service Reuters Cliquer sur le Web Service (ReutersSMX.xms) avec le bouton droit de la souris et cliquer sur « Deploy » Le Web Service est actuellement fonctionnel. Albert Ritch – Les Web Services Page 76 novembre 2003 – v1.0 B-5.2 Création de la partie informations boursières du client Le diagramme de classe de la partie client est identique à celle du serveur Reuters. Seule une vue sur la classe Portefeuille a été ajoutée. Créer un nouveau projet C# sous Visual Studio .NET. Créer une fenêtre principale et une fenêtre secondaire selon la copie d'écran ci-dessous. Cette fenêtre doit contenir un DataGrid (équivalent d'une JTable en Java) pour l'affichage des titres. Fig B-20 : La maquette de la fenêtre des titres Les classes créées sont donc : MainWindow.cs fenêtre principale MDI Titre.cs la classe titre Bourse.cs la classe bourse qui regroupe les titres BourseVue.cs la fenêtre ci-dessus (fig. 5-5) qui est une vue de la classe Bourse Voici ci-dessous un extrait de la classe MainWindow qui fait les actions suivantes : • Création de l'objet Reuters qui est le Web Service • Création d'un objet Bourse • Invocation du Web Service Reuters qui envoie les attributs des titres de la bourse suisse (SWX). • Création des objets Titre avec les paramètres reçu du Web Service • Ajout dans la classe Bourse des titres instanciés • Création par l'objet Bourse d'ouvrir une vue sur lui même (Singleton) Albert Ritch – Les Web Services Page 77 novembre 2003 – v1.0 private void menuItem3_Click(object sender, System.EventArgs e) { // un objet correspondant au type retourné par le Web Service object[] titre; // le nombre de titres int nbTitres; // les attributs des titres int code; string nom; string abrev; double valeur; double bid; double ask; int volume; // création de l'objet Reuters ReutersFinance.ReutersFinance Reuters = new ReutersFinance.ReutersFinance(); //récupération du nombre de titres nbTitres = Reuters.getNbTitres(); // la fenêtre affichée est un singleton if (singleton) { } else { singleton = true; // création de la Bourse Bourse pf = new Bourse(1); // création des titres for (int i = 0; i < nbTitres; i++) { // récupération du titre i titre = Reuters.getTitre(i); // affectation des attributs code = (int)titre[0]; nom = titre[1].ToString(); abrev = titre[2].ToString(); valeur = (double)titre[3]; bid = (double)titre[4]; ask = (double)titre[5]; volume = (int)titre[6]; // création du titre avec les attributs Titre t = new Titre(code, nom, valeur, abrev, bid, ask, volume); pf.addTitre(t); } // on demande à la classe bourse de créer une vue sur elle-même // .. en lui donnant en parametre la vue principale pf.createView(this); } // if } // menuItem3_Click } // classe MainWindow Voici ci-dessous un extrait du code de la classe BourseVue.cs qui remplit le DataGrid à partir des Albert Ritch – Les Web Services Page 78 novembre 2003 – v1.0 informations des titres public void initializeElements() { // c'est ici que les vidgets vont être initialisés this.setTitres(this.pfeuille.getTitres()); // Creation d'un DataSet dsTitres = new DataSet("dsTitres"); // Creation de la DataTable "Titres" DataTable dtTitres = new DataTable("Titre"); // Création des colonnes correspondant aux titres dtTitres.Columns.Add(new DataColumn("Num ISIN", Type.GetType("System.Int32"))); dtTitres.Columns.Add(new DataColumn("Nom", Type.GetType("System.String"))); dtTitres.Columns.Add(new DataColumn("Abreviation", Type.GetType("System.String"))); dtTitres.Columns.Add(new DataColumn("Valeur", Type.GetType("System.Double"))); dtTitres.Columns.Add(new DataColumn("Bid", Type.GetType("System.Double"))); dtTitres.Columns.Add(new DataColumn("Ask", Type.GetType("System.Double"))); dtTitres.Columns.Add(new DataColumn("Volume", Type.GetType("System.Int32"))); for (int i = 0; i < this.pfeuille.getTitres().Count; i++) { object obj = this.pfeuille.getTitres()[i]; int num = ((Titre)obj).getNum(); string nom = ((Titre)obj).getNom(); string abv = ((Titre)obj).getCode(); double val = ((Titre)obj).getValeur(); double bid = ((Titre)obj).getBid(); double ask = ((Titre)obj).getAsk(); int volume = ((Titre)obj).getVolume(); dtTitres.Rows.Add(new Object[] {num, nom, abv, val, bid, ask, volume}); } dsTitres.Tables.Add(dtTitres); this.dataGrid1.DataSource = dsTitres.Tables["Titre"]; // affichage du nombre de titres this.tbNbTitres.Text = this.pfeuille.getTitres().Count.ToString(); /* this.dataGrid1.DataSource = (ArrayList)this.pfeuille.getTitres(); this.dataGrid1.Refresh(); */ } Après invocation du Web Service, on remplit le DataGrid des titres reçus de Reuters. Albert Ritch – Les Web Services Page 79 novembre 2003 – v1.0 Utilisation de la partie client Lors de l'ouverture de la fenêtre des titres, le Web Service Reuters fournit les titres avec leurs paramètres à partir desquels, le DataGrid est rempli. Fig B-21 : Les titres reçus du serveur Reuters Albert Ritch – Les Web Services Page 80 novembre 2003 – v1.0 B-5.3 Création de la partie banque GBS La banque GBS doit permettre de passer un ordre d'achat (fictif). Pour simplifier le code, on considère que le client possède qu'un seul portefeuille et un seul compte. Fig. B-22 : Diagramme de classe de la banque L'ordre d'achat passé, le titre acheté est ajouté au portefeuille du client, puis le solde du compte est renvoyé. Voici le service d'achat de titres. public double achatTitre(int numIsin, int nombre, Date dateMax, double prixMax) { this.cli.getPortefeuille().achatTitre(numIsin, nombre, dateMax, prixMax); this.cli.getCompte().setSolde(nombre * this.cli.getPortefeuille().getBourse().getTitre(numIsin).getValeur()); return this.cli.getCompte().getSolde(); } Albert Ritch – Les Web Services Page 81 novembre 2003 – v1.0 B-5.4 Fin de la partie client Il faut maintenant compléter la partie achat de titre du client. Pour cela, en mode édition, doublecliquer sur le bouton « Achat » de la fenêtre « BourseVue » afin de pouvoir coder l'événement d'achat. Voici le code ajouté correspondant au bouton « Achat ». private void btAchat_Click(object sender, System.EventArgs e) { int realIsin; realIsin = this.selectedRow + 1; if (MessageBox.Show("Voulez-vous bien acheter le titre n°ISIN " + realIsin.ToString() + " ?", "", MessageBoxButtons.YesNo)== DialogResult.Yes ) { // a faire en cas de oui : msgb = new MsgBox(this); msgb.ShowDialog(); if (msgb.etat) { // utilisation du portefeuille //this.brs.getPort().achatTitre(this.selectedRow, this.nombre, this.dateMax, this.prixMax); double solde; GBSBWS.GBSBWS Gbsb = new GBSBWS.GBSBWS(); solde = Gbsb.achatTitre(this.selectedRow, this.nombre, this.dateMax, this.prixMax); MessageBox.Show("Votre ordre a été passé\n Le solde de votre compte se monte à " + solde + " CHF"); } // } else { // on ne fait rien } } Une fenêtre supplémentaire (modale) est également créée, servant à la saisie des paramètres d'achat du titre. Utilisation de la partie client Le choix du titre à acheter se fait en cliquant dans la marge. On voit sur la figure ci-dessus que le titre « Clariant » à été choisit. L'utilisateur doit ensuite cliquer sur « Achat ». Fig. B-23 : Choix d'un titre Albert Ritch – Les Web Services Page 82 novembre 2003 – v1.0 Fig. B-24 : Validation de l'achat Après une validation, l'utilisateur doit entrer les paramètres d'achat, à savoir le nombre de titres qu'il veut acheter, le prix maximum d'achat et la date de péremption de l'ordre. Fig. B-25 : Paramètres d'achat Une fois l'ordre passé, il reçoit un message de confirmation avec le nouveau solde de son compte (solde d'origine : 2000 CHF) Fig. B-26 : L'ordre est passé Albert Ritch – Les Web Services Page 83 novembre 2003 – v1.0 Conclusion Les Web Services apportent des avantages indéniables dans les technologies d'intégration et en terme d'ouverture des entreprises vers ses partenaires en offrant des services directement issus de leur système d'information. En effet, je ne pense pas que les Web Services soient un effet de mode comme prétendent ses détracteurs. Si ils ne remplacent pas directement les technologies existantes comme CORBA, ils ont le mérite de donner une nouvelle impulsion à la réflexion concernant la réutilisabilité et l'interopérabilité des système d'information. Les développeurs pourront alors d'avantage se concentrer sur la conception et le développement des processus métier du système d'information plutôt que sur les problèmes techniques liés à l'intégration et l'interopérabilité. Albert Ritch – Les Web Services Page 84 novembre 2003 – v1.0 Bibliographie Livres [CHA102] Services Web avec Jean-Marie ISBN : 2-212-11047-2 SOAP, [ENG03] Java et Robert ISBN : 2-84177-230-6 [MAE03] Services Web Libero Maesano, ISBN : 2-212-11067-7 avec WSDL, UDDI, ebXML SOAP – J2EE Christian et .NET Bernard, – Eyrolles 2002 CHAUVET O'Reilly – Xavier 2003 ENGLANDER Eyrolles Le 2003 Galles [01I01] Xml La Synthese – 01 Informatique 2001 Anelyse Boukhors, Alexandre Kaszycki, Jérôme Laplace, Sandrine Munerot, Laurent Poublan ISBN : 2-10-008180-2 Documents Internet [01N03] Les services web à 01NET http://www.01net.com/article/214646.html la rescousse de l'intégration [BUR203] Plate-forme J2EE: cinq critères pour faire le bon choix Carole BURET http://www.zdnet.fr/techupdate/infrastructure/imprimer.htm?AT=2135287-39020938t-39000766c [CRO102] Les serveurs d'applications en Antoine http://solutions.journaldunet.com/0210/021003_serveurs.shtml 7 questions CROCHET-DAMAIS [DHE02] Panorama EAI: du BPM à l'intégration Cyril http://solutions.journaldunet.com/0202/020211_comparo_eai_notions.shtml [DON02] Panorama Didier sur les Web B to B DHENIN Services DONSEZ http://www-adele.imag.fr/~donsez/cours/webservices.pdf [FAR03] Les Enterprise Albert Ritch – Les Web Services Service Page 85 Bus novembre 2003 – v1.0 Nicolas http://www.ib-com.ch/pages/archives/03.04/0304tribune.html FARGES [FER01] "Les projets d'intégration passeront par un changement Guy http://solutions.journaldunet.com/itws/010914_it_fermon.shtml profond des mentalités" FERMON [HAN03] Créer un service web avec Jeff http://www.zdnet.fr/builder/architecture/services_web/0,39021055,2136920,00.htm [JEA01] Architectures distribuées et Fabrice http://www.webatrium.com/services/download/ServeurAppli.pdf serveurs [LEO03] Développer un webservice en PHP, un client en PHP, Grégory http://www.labo-dotnet.com/labo-dotnet/?target=showonearticle&ID=32 [MAU203] L'ESB rebâtit l'EAI Laurent http://www.01net.com/article/214645.html sur Tomcat [ROU02] Le Guide d'installation de Patrick http://www.apachefrance.com/Articles/6/imprime/ Tomcat [SOA103] SOAP SOAPUSER http://www.soapuser.com/fr/server1.html [SOA203] Bases SOAPUSER http://www.soapuser.com/fr/basics1.html [SUN103] Building Web Services – SUN Albert Ritch – Les Web Services d'application JEAN-FRANCOIS et un client .Net. LEOCADIE les [MIC02] Office XP Web Services MICROSOFT http://www.microsoft.com/office/developer/webservices/toolkit.asp [ROU01] Le Guide d'installation de Patrick http://www.apachefrance.com/Articles/5/imprime/ JWSDP HANSON standards MAURY Toolkit Tour pour Windows ROUMANOFF pour Linux ROUMANOFF Côté-Serveur SOAP Sun One Page 86 Studio Programming Series novembre 2003 – v1.0 http://docs-pdf.sun.com/817-2324/817-2324.pdf [VAW01] J2EE vs. Microsoft.NET - A comparison of building XML-based Chad VAWTER, Ed http://www.theserverside.com//resources/article.jsp?l=J2EE-vs-DOTNET Albert Ritch – Les Web Services Page 87 web services ROMAN novembre 2003 – v1.0