930 likes | 1.03k Views
WebServices. Philippe.Bedu@edf.fr. Composants. Time to market Améliorer la productivité Réduire la complexité Réutiliser si possible Assemblage plutôt que programmation Réduire les besoins en compétences spécialisées Recentrage sur l’expertise du domaine Améliorer la qualité du logiciel.
E N D
WebServices Philippe.Bedu@edf.fr
Composants • Time to market • Améliorer la productivité • Réduire la complexité • Réutiliser si possible • Assemblage plutôt que programmation • Réduire les besoins en compétences spécialisées • Recentrage sur l’expertise du domaine • Améliorer la qualité du logiciel
Web Services (1) • Opération : action invocable • Interface : partition des opérations • Service : ensemble des interfaces utilisables pour une autre application coopérative Service Web • Service invocable à travers le réseau • Non basé sur le contenu (pages web) • Délivre des données structurées à une application Profiter des standards du moment
Web Services (2) • Utilisation pour l'intégration • Dans un portail • Applications d'entreprise • B2B Internet Intranet Service météo Portail météo Normalisation d'adresse traducteur traduction vente commande B Processus Achat
WS interface WS interface WS interface Web Services (3) SGBD procédures cataloguées WS interface WS interface Orchestration de Flux Serveur d'applications Adaptateur progiciels Systèmes orientés Messages, courtiers d'Intégration
Web Services (4) Pile de protocoles Services techniques Services métier Processus, workflow BPEL ebXML WS-coordination RosettaNet WS-Transaction Annuaire UDDI, WSIL Description WSDL Sécurité WS-Security XML-based message SOAP : messaging Transport http,httpr,smtp,ftp,mq,iiop… TCP/IP
Plan • SOAP • Protocole de transmission de messages XML • WSDL • Web Services Description Language • UDDI • Universal Description Discovery and Integration • Web Services • Intégration avec l'existant
SOAP • SOAP 1.1 • Un moyen de faire communiquer des applications par RPC en utilisant HTTP • Proposé à W3C en 2000 par UserLand, Ariba, Commerce One, Compaq, Developmentor, HP, IBM, IONA, Lotus, Microsoft etSAP • SOAP 1.2 • travaux W3C • Protocole de transmission de messages en XML
SOAP ? • SOAP protocole XML permettant la communication entre composants logiciels et applications en s’appuyant sur des protocoles standards de type http, smtp, … • SOAP Simple Object Access Protocol • SOAP Service Oriented Architecture Protocol • SOAP est un protocole de transmission de messages • SOAP est adapté à la communication entre applications • SOAP est un format d’échange de messages • SOAP est conçu pour fonctionner sur l’Internet • SOAP est indépendant des plates-formes et des langages • SOAP est basé sur XML • SOAP est simple et extensible • SOAP en voie de standardisation par W3C
OK, et CORBA alors? (1) • CORBA prend aussi en compte tous ces points • mais exige de compiler et distribuer des stubs clients pour chaque type de clients • pas toujours pratique pour un grand nombre de combinaisons de plates-formes et de langages ou lors de fourniture de services à des clients anonymes au travers d’Internet
OK, et CORBA alors? (2) • String-ware ? • SOAP est un protocole basé sur XML • En conséquence, particulièrement prolixe • CORBA, au travers de IIOP, le battra en performance car les opérations de conversion et de déconversion (marshalling et demarshalling) dans CORBA sont plus efficaces et il y a moins de données sur le réseau. • Néanmoins les messages en xml sont lisibles et utilisables : utile pour la mise au point
SOAP Scenarii (1) Requête réponse, requête avec acquittement ou RPC sur un protocole de transport assurant la corrélation Envoi et oublie, avec un ou n récepteurs Nœud SOAP ultime récepteur Nœud SOAP émetteur initial Appli SOAP Appli SOAP Niveau SOAP processeur SOAP processeur SOAP Niveau protocole de transport Hôte 1 Hôte 2
SOAP Scenarii (2) Requête réponse, requête avec acquittement ou RPC sur un protocole de transport n'assurant la corrélation Corrélation de messages Nœud SOAP émetteur initial Nœud SOAP ultime récepteur Nœud SOAP émetteur initial Nœud SOAP ultime récepteur Appli SOAP B Id message Appli SOAP B Id message Appli SOAP A Id message Appli SOAP A Id message Niveau SOAP processeur SOAP processeur SOAP processeur SOAP processeur SOAP Niveau protocole de transport Hôte 1 Hôte 2 Hôte 2 Hôte 1
SOAP Scenarii (3) Requête réponse, requête avec acquittement ou RPC via de multiples intermédiaires Nœud SOAP émetteur initial Nœud SOAP intermédiaire Nœud SOAP ultime récepteur Appli SOAP B routage Appli SOAP A routage Appli SOAP A routage processeur SOAP processeur SOAP processeur SOAP Niveau SOAP Niveau protocole de transport Hôte 1 Hôte 2 Hôte 3 Changement de protocole possible
SOAP Scenarii (4) • Requêtes avec cryptage du contenu ou de l'en-tête • Echange avec tierce partie • Conversation • Messages asynchrones • Multiples réponse asynchrones • Echange de données Non-XML • Notification d'événements • Cache, cache avec expiration • Qualité de service • Echange avec analyse et traitement incrémental • Routage, tracking • Grilles • Et autres, en fonction de l'imagination des architectes
SOAP message • Un message SOAP valide est un document XML au bon format. Le message doit avoir la forme suivante: • Une déclaration XML (optionnelle) • Une Enveloppe SOAP (l'élément racine) qui est composée de: • Une En-tête SOAP (optionnel : infos nécessaires à l'interprétation du message) • Un Corps SOAP (données du message) • Une section d’erreur SOAP
SOAP message • Règles de syntaxe: • un message SOAP MUST être codé en XML • un message SOAP MUST avoir une enveloppe SOAP • un message SOAP CAN avoir un entête SOAP (header) • un message SOAP MUST avoir un corps SOAP (body) • un message SOAP MUST utiliser l'espace de désignation de l'enveloppe SOAP • un message SOAP MUST utiliser l'espace de désignation d'encodage SOAP • un message SOAP MUST NOT contenir une référence à une DTD • un message SOAP MUST NOT contenir des instruction de type XML Processing
SOAP Exemple • <Envelope> est la racine • <Header>, <Body> et <Fault> sont les enfants : <?xml version="1.0" encoding="UTF-8" standalone="no" ?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <soap:Header> ... Header information... </soap:Header> <soap:Body> ... Body information... <soap:Fault> ...Fault information... </soap:Fault> </soap:Body> </soap:Envelope>
SOAP Enveloppe • <SOAP-ENV:Envelope ... >le style d'encodage de ce message SOAP suit le schéma défini dans http://schemas.xmlsoap.org/soap/encoding • Contient les définitions de namespaces. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/ 2001 /XMLSchema"> </SOAP-ENV:Envelope>
SOAP Entête (1) • Mécanisme pour étendre un message de façon décentralisée et modulaire, sans connaissance a priori des parties de la communication. • Typiquement authentification, transaction, … • Règles : • Identifié par un namespace et un nom local • Les enfants immédiats qualifiés par le namespace.
SOAP Entête (2) • 2 attributs particuliers utilisés pour indiquer comment et par qui l’entrée est traitée • mustUnderstand : Indiquer qu’une entrée est obligatoire <SOAP-ENV:Header> <t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1"> 5 </t:Transaction> </SOAP-ENV:Header> • Actor : Indiquer qui peut utiliser l'entête ; par défaut : l’ultime <SOAP-ENV:Header> <m:local xmlns:m =’’http://www.w3edfRetD.edu/local/’’ soap:actor= http://www.w3edfRetD.edu/appli > <m:language> dk </m:language> </m:local> </soap:Header>
Soap Body • Mécanisme simple pour échanger les informations avec l’ultime receveur du message. • Typiquement appels marshalling RPC calls et des rapports d’erreur • Une entrée du body est identifiée par un namesapce et un nom local <SOAP-ENV:Body> <ns1:doubleAnIntegerResponse xmlns:ns1="urn:MesSoapServices" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <return xsi:type="xsd:int">30</return> </ns1:doubleAnIntegerResponse> </SOAP-ENV:Body>
SOAP section d’erreur • Utilisée pour porter les erreurs ou les statuts d’erreur d’un message • Doit apparaître comme une entrée du body • Ne doit pas apparaître plus d’une fois • Sous éléments : • faultcode • Identifier l’erreur • faultstring • Explication de l’erreur <env:Body> <env:Fault> <faultcode><value>env:VersionMismatch</value> </faultcode> <faultstring>Version Mismatch</faultstring> </env:Fault> </env:Body>
SOAP encodage de graphes • L’information est traitée comme un graphe constitué de nœuds intermédiaires ou terminaux et de liens entre ces nœuds. • Il existe des règles d’encodage de ces graphes • Valeurs simples • XML schema Built-in datatypes et dérivés • Ou SOAP-ENC pour des éléments indépendants d’un type hétérogène • Valeurs composites • Tableaux et structures
SOAP Types simples <element name="age" type="int"/> <element name="height" type="float"/> <element name="displacement" type="negativeInteger"/> <element name="color"> <simpleType base="xsd:string"> <enumeration value="Green"/> <enumeration value="Blue"/> </simpleType> </element> <age>45</age> <height>5.9</height> <displacement>-450</displacement> <color>Blue</color> <SOAP-ENC:int id="int1">45</SOAP-ENC:int>
SOAP Types composites (1) <element name="Livre"> <complexType> <element name="auteur" type="xsd:string"/> <element name="preface" type="xsd:string"/> <element name="intro" type="xsd:string"/> </complexType> </e:Livre> <e:Livre> <author>jean Bonneau</author> <preface>Preface Soap INT</preface> <intro>Introduction à SOAP</intro> </e:Livre>
SOAP Types composites (2) <e:Livre> <titre>SOAP à INT</titre> <auteur href="#Personne-1"/> </e:Livre> <e:Personne id="Personne-1"> <name>Jean Bonneau</name> <addresse href="#Addresse-2"/> </e:Personne> <e:Addresse id="Addresse-2"> <email>mailto:jbonneau@hotmail.com</email> <web>http://www.jbonneau.com</web> </e:Addresse>
SOAP Types composites (3) Structure du livre <element name="Livre" type="tns:Livre"/> <complexType name="Livre"> <sequence minOccurs="0" maxOccurs="1"> <element name="titre" type="xsd:string"/> <element name="auteur" type="tns:Personne"/> </sequence> <attribute name="href" type="uriReference"/> <attribute name="id" type="ID"/> <anyAttribute namespace="##other"/> </complexType>
SOAP Types composites (4) Structure de Personne <element name="Personne" base="tns:Personne"/> <complexType name="Personne"> <sequence minOccurs="0" maxOccurs="1"> <element name="nom" type="xsd:string"/> <element name="addresse" type="tns:Addresse"/> </sequence> <attribute name="href" type="uriReference"/> <attribute name="id" type="ID"/> <anyAttribute namespace="##other"/> </complexType>
SOAP Types composites (5) Structure de Adresse <element name="Addresse" base="tns:Addresse"/> <complexType name="Addresse"> <sequence minOccurs="0" maxOccurs="1"> <element name="rue" type="xsd:string"/> <element name="ville" type="xsd:string"/> <element name="pays" type="xsd:string"/> </sequence> <attribute name="href" type="uriReference"/> <attribute name="id" type="ID"/> <anyAttribute namespace="##other"/> </complexType>
SOAP Array • Définis par le type "SOAP-ENC:Array" ou dérivé • Représentés comme des éléments de valeur sans contrainte sur le nom du contenu <element name="mesResultats" type="SOAP-ENC:Array"/> < mesResultats SOAP-ENC:arrayType="xsd:int[2]"> <number>3</number> <number>4</number> </ mesResultats >
SOAP sur HTTP • Message SOAP dans le corps HTTP • En-tête HTTP 'soapAction' POST http://www.w3edfRetD.fr http/1.1 Content-type:text/xml ; charset="utf-8" SOAPAction: http://www.w3edfRetD.fr#service <SOAP-ENV:Envelope …. </SOAP-ENV:Enveloppe>
SOAP requête RPC <soap:Envelope> <soap:Body> <xmlns:m="http://www.w3edfRetD.edu/stock" /> <m:GetStockPrice> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>
SOAP réponse RPC <soap:Envelope> <soap:Body> <xmlns:m="http://www.w3edfRetD.edu/stock" /> <m:GetStockPriceResponse> <m:Price>20.5</m:Price> </m:GetStockPriceResponse> </soap:Body> </soap:Envelope>
SOAP Principes RPC (1) • Processus Client avec binding http Package soap Requête http envoyée au serveur SOAP Enveloppe la requête SOAP-XML En requête http Sérialise en requête SOAP-XML Construction de l'appel de méthode Réponse http reçue du serveur SOAP Désérialise la réponse SOAP-XML En réponse de méthode Extrait la réponse SOAP-XML de la réponse http Retourne la valeur Serializer/deserializer Encoding/decoding http
SOAP Principes RPC (2) • Processus Serveur avec binding http Package soap Canal de requête du servlet Décode la requête http et dé-sérialise la requête SOAP-XML envoie requête décodeur Requête http du client SOAP Invoque la méthode Opération du Service envoie réponse décodeur Retourne la réponse http au client SOAP sérialise la réponse SOAP-XML et encode de la réponse http Canal de réponse du servlet Envoie la réponse Encoding/decoding http et soap Servlet SOAP
SOAP Exemple (1) • Service de normalisation d'adresses • Capable de fournir une adresse postale normalisée à partir d'informations de localisation • Utilise des types de données complexes en entrée et en sortie NormAdresse getNorme( Local adresse_local) Service NormalisationAdresse Application SOAP XML getNorme wsdl Interface Implantation opération Public et standard Privé et propriétaire
SOAP Exemple (2) : Serveur-Déploiement Le WSDL associé <Definitions> Racine et namespace A voir plus tard en détail <Types> Quels types de données dont échangés <Message> Quels messages sont transmis <Port type>Quelles opérations sont supportées <Binding> Comment les messages sont transmis sur la connexion <service> Où est situé le service
SOAP Exemple (3) : Serveur-Code • Classe DoNorme • Méthode getNorme : retourne une adresse normalisée • Local et NormAdresse : Bean • Accesseurs (get_) et mutateurs (set_) pour chaque attribut • Afin d'utiliser un BeanSerializer • Servlet d'initialisation de contexte
SOAP Exemple (4) : Client-Code • Mapping des types // Build the call. Service service = new Service(); Call call = (Call) service.createCall(); // Map the types. QName qn1 = new QName( "urn:NormAdresse", "Local" ); call.registerTypeMapping(Local.class, qn1, new org.apache.axis.encoding.ser.BeanSerializerFactory(Local.class, qn1), new org.apache.axis.encoding.ser.BeanDeserializerFactory(Local.class, qn1)); QName qn2 = new QName( "urn:NormAdresse", "NormAdresse" ); call.registerTypeMapping(NormAdresse.class, qn2, new org.apache.axis.encoding.ser.BeanSerializerFactory(NormAdresse.class, qn2), new org.apache.axis.encoding.ser.BeanDeserializerFactory(NormAdresse.class, qn2)); Serialiser la classe Local
SOAP Exemple (5) : Client-Code • Construire l'appel call.setTargetEndpointAddress( new java.net.URL(endpointURL) ); call.setOperationName( new QName("NormAdresseService", "getNorme") ); call.addParameter( "AdresseDuLocal", qn1, ParameterMode.IN ); call.setReturnType(qn2,NormAdresse.class); //Build the params le_local.setloc_no_voie(" 9 BIS"); le_local.setloc_l_voie1("Chemin de la Sablière "); le_local.setloc_l_voie2("BP 12"); le_local.setloc_c_postal(" 91430"); le_local.setloc_l_bd(" Igny"); Object resp resp = call.invoke( new Object[] { le_local } ); Méthode On aurait pu directement construire le XML dans un SOAPBodyElement[] et le passer au call
SOAP Exemple (6) : Client-Code • Exploiter le résultat // if (resp instanceof java.rmi.RemoteException) { throw(java.rmi.RemoteException) resp; } else try { NormAdresse value = (NormAdresse)resp; if ( value != null ) { System.out.println("retour :"); System.out.println("code"+value.getAdr_c_postal()); … } } catch(java.lang.Exception e) { …}
WSDL Web Services Description Language Vocabulaire XML, similaire dans le principe à IDL • Il contient des informations opérationnelles concernant le service : • L'interface du service • Les détails d'implantation • Les protocoles d'accès • Les points d'activation (contact endpoints) WSDL : convergence de deux langages IBM's NASSL Microsoft's SDL
WSDL <definitions> : Définition du service. Racine de tout WSDL. Elle peut contenir les attributs précisant le nom du service, et les espaces de nommage. Il contient trois types d’éléments : <message> et <portType> : Définissent les opérations offertes par Le service. Un <message> correspond à un paramètre d’entrée ou de sortie d’une <operation>. Un <portType> définit un ensemble d’opérations. Une <operation> possède un nom et des paramètres d'E/S. <binding> : Associe les <portType> à un protocole particulier. Par exemple SOAP. <service> : Précise les informations nécessaires à l'invocation d'un service, en particulier l’URI du destinataire. Un <service> est une collection de <port> ;ie d’associations de <binding> et d'URI. Les types de données complexes peuvent être précisés dans une balise <types> placée juste avant la balise <message>. Chaque élément WSDL peut être documenté grâce à une balise <documentation>.
WSDL : exemple (1) L’exemple suivant est la description du service Echo précédemment défini : <wsdl:definitions targetNamespace="http://cli20ir:9595/axis/services/NormAdresseService/axis/services/NormAdresseService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://cli20ir:9595/axis/services/NormAdresseService/axis/services/NormAdresseService-impl" xmlns:intf="http://cli20ir:9595/axis/services/NormAdresseService/axis/services/NormAdresseService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="urn:NormAdresse" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"> La première partie du fichier définit les espaces de nommage
WSDL : exemple(2) <wsdl:types> <schematargetNamespace="urn:NormAdresse" xmlns="http://www.w3.org/2001/XMLSchema"> <complexTypename="Local"> <sequence> <element name="loc_no"nillable="true"type="xsd:string"/> <element name="cli_ic_orig"nillable="true"type="xsd:string"/> … </sequence> </complexType> <element name="Local"nillable="true"type="tns1:Local"/> </schema> </wsdl:types> On trouve ensuite les types particuliers utilisés
WSDL : exemple (3) Puis les paramètres d’entrée et de sortie des opérations du service <wsdl:message name="getNormeResponse"> <wsdl:part name="return"type="tns1:NormAdresse" /> </wsdl:message> <wsdl:message name="getNormeRequest"> <wsdl:part name="adresse_local"type="tns1:Local"/> </wsdl:message> <wsdl:portTypename="DoNorme"> <wsdl:operationname="getNorme"parameterOrder="adresse_local"> <wsdl:input message="intf:getNormeRequest"name="getNormeRequest" /> <wsdl:output message="intf:getNormeResponse"name="getNormeResponse" /> </wsdl:operation> </wsdl:portType> La définition abstraite du service Web est faite par définition du portType, indépendante de tout protocole de communication. C’est l’interface du service définissant les méthodes exportées, et leurs paramètres d’entrée et de sortie.
WSDL : exemple (4) <wsdl:binding name="NormAdresseServiceSoapBinding"type="intf:DoNorme"> <wsdlsoap:binding style="rpc"transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operationname="getNorme"> <wsdlsoap:operation soapAction="" /> <wsdl:input name="getNormeRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://cli20ir:9595/axis/services/NormAdresseService/axis/services/NormAdresseService"use="encoded" /> </wsdl:input> <wsdl:outputname="getNormeResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://cli20ir:9595/axis/services/NormAdresseService/axis/services/NormAdresseService"use="encoded" /> </wsdl:output> </wsdl:operation> </wsdl:binding> Ce service est associé à un protocole existant, via un binding . Il définit les paramètres d’invocation du service spécifiques au protocole. Les paramètres nécessaires à l’utilisation (lien vers les spécifications du transport utilisé, règles d’encodage pour les messages échangés, …).
WSDL : exemple (5) <wsdl:service name="DoNormeService"> <wsdl:port binding="intf:NormAdresseServiceSoapBinding" name="NormAdresseService"> <wsdlsoap:address location=http://cli20ir:9595/axis/services/NormAdresseService /> </wsdl:port> </wsdl:service> </wsdl:definitions> La définition du service se termine par la définition de plusieurs bindings, associés à plusieurs URL, et ce en utilisant la même définition abstraite du service.
WSDL • WSDL créé automatiquement à partir de Java avec Java2WSDL • Utilisation • Construire un proxy pour une utilisation directe à partir du client ou d'un autre Service avec WSDL2J DoNorme binding = new DoNormeServiceLocator().getNormAdresseService(); NormAdresse value = binding.getNorme(le_local); • Exploiter dynamiquement le WSDL avec WSDL4J • Pour une invocation dynamique ou bien pour automatiser l'enregistrement et la publication dans un annuaire