Informatique Répartie - Web Services
Transcription
Informatique Répartie - Web Services
INSA - ASI InfoRep : WebServices Informatique Répartie Web Services Alexandre Pauchet INSA Rouen - Département ASI BO.B.RC.18, [email protected] 1/38 INSA - ASI InfoRep : WebServices Plan 1 Introduction 2 SOAP 3 WSDL 4 Implémentation avec JBoss 5 Passage d’objets et exceptions 6 Alternative : Axis 7 Références 2/38 INSA - ASI InfoRep : WebServices Introduction (1/4) Objectif Limitations de Corba et RMI Impossibilité de faire transiter des informations à travers un pare-feu Solution : utiliser Le protocole internet (Http) comme protocole de transport XML pour le formatage des données Mode RPC sur Internet 3/38 INSA - ASI InfoRep : WebServices Introduction 4/38 (2/4) Vocabulaire Services Web : composant logiciel distribué qui utilise le protocole internet pour le transport des requêtes (HTTP ou SMTP) et XML pour le formatage des données UDDI (Universal Description, Discovery and Integration) : annuaire des services web WSDL (Web Services Description Language) : langage reposant sur XML qui permet de décrire un service web SOAP (Simple Object Access Protocol) : protocole de Service Web avec état (développé par Microsoft, DevelopMentor et UserlanSoftware) XML-RPC : protocole de Service Web sans état (développé par Dave Winer de Frontier et Userland) INSA - ASI InfoRep : WebServices Introduction (3/4) XML-RPC versus SOAP “XML-RPC est une spécification et un ensemble d’implémentations permettant de faire du RPC avec http et le langage XML, exactement de la même façon que SOAP. En fait les histoires de XML-RPC et de SOAP sont intimement liées. À l’origine XML-RPC était appelé informellement SOAP par ces concepteurs dont l’instigateur était Dave Winer. Les premiers développement étaient fait en collaboration entre les équipes de UserLand, DevelopMentor et Microsoft. Mais déçu par la tournure des choses, Dave Winer décide de séparer sa spécification de celle de Microsoft. Cela aboutit à XML-RPC. Rapidement Microsoft va jouer le standard de fait, en introduisant son SOAP dans un groupe de travail du W3C. Aujourd’hui SOAP supporte plus de fonctionnalités que XML-RPC (pas toujours utiles ?) et c’est une spécification en devenir alors que XML-RPC est figée.” Jean-Marc Pierson http://www.if.insa-lyon.fr/chercheurs/jmpierson/Reseau4IF/ Projets/ProgrammationDistribuee/soap/soap.htm 5/38 INSA - ASI InfoRep : WebServices Introduction (4/4) Acteurs Nombreux acteurs Microsoft .Net Apache : Axis (2), CXF Sun : JAX-WS et Metro JBoss Autres implémentations open-source etc. Interopérabilité Services des uns utilisables par les autres WS-I.org : Web Service Interoperability organization 6/38 INSA - ASI SOAP InfoRep : WebServices (1/5) Description Organisation d’un message SOAP Requête HTTP En−tête HTTP POST /soap Contenu/longueur Requête SOAP Enveloppe SOAP En−tête Corps 7/38 INSA - ASI SOAP InfoRep : WebServices (2/5) Exemple de requête SOAP Requête Http contenant un message SOAP POST /axis/HelloService.jws HTTP/1.0 Content-Type: text/xml; charset=utf-8 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: Axis/1.0 Host: localhost:5555 Cache-Control: no-cache Pragma: no-cache SOAPAction: "" Content-Length: 403 <?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> <sayHello soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <arg0 xsi:type="xsd:string">Toto</arg0> </sayHello> </soapenv:Body> </soapenv:Envelope> 8/38 INSA - ASI SOAP InfoRep : WebServices (3/5) Réponse SOAP Réponse SOAP à une requête SOAP HTTP/1.1 200 OK Set-Cookie: JSESSIONID=A71CF66D85AD77975999A0F8A4B71BA5; Path=/axis Content-Type: text/xml; charset=utf-8 Date: Wed, 09 Apr 2003 10:10:06 GMT Server: Apache Coyote/1.0 Connection: close <?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> <sayHelloResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <sayHelloReturn xsi:type="xsd:string">Hello, Toto</sayHelloReturn> </sayHelloResponse> </soapenv:Body> </soapenv:Envelope> 9/38 INSA - ASI InfoRep : WebServices SOAP (4/5) Sérialisation des données Sérialisation des données SOAP utilise les types définis dans XML Schema : Cf. http://www.w3.org/TR/xmlschema-2/ Cf. Cours de Document On a donc la possibilité de sérialiser : des types simples (près d’une quarantaine) des structures (xs:complexType) On a aussi la possibilité de sérialiser des tableaux en utilisant un schema qui défini l’élément Array et l’attribut arrayType : http://www.w3.org/2001/09/soap-encoding 10/38 INSA - ASI SOAP InfoRep : WebServices (5/5) 11/38 INSA - ASI InfoRep : WebServices WSDL (1/4) Description Fichier XML décrivant un service web Opérations (services) disponibles Accession (addresse, protocole, etc.) Format des messages échangés entre client et serveur Pour invoquer le service Pour interpréter un résultat Rien sur sa sémantique (ce qu’il fait) 12/38 INSA - ASI WSDL InfoRep : WebServices 13/38 (2/4) Interface/Implémentation Description WSDL Des types sont utilisés dans des messages, associés dans des portTypes, reliés à un protocole par des bindings formant des Services Web. INSA - ASI InfoRep : WebServices WSDL 14/38 (3/4) Contenu types : Contient les définitions de types utilisant un système de typage (comme XSD) message : Décrit les noms et types d’un ensemble de champs à transmettre (Paramètres d’une invocation, valeur du retour, etc.) portType : Décrit un ensemble d’opérations. Chaque opération a 0 ou 1 message en entrée, 0 ou plusieurs messages en sortie binding : Spécifie une liaison d’un <porttype> à un protocole concret (SOAP1.1, HTTP1.1, MIME, etc.). Un <porttype> peut avoir plusieurs liaisons ! port : Spécifie un point d’entrée (endpoint) comme la combinaison d’un <binding> et d’une adresse réseau service : Une collection de points d’entrée (endpoint) relatifs INSA - ASI InfoRep : WebServices WSDL (4/4) Outils Générateur WSDL à partir de déploiements SOAP ou EJB, Générateur de proxy SOAP à partir de WSDL Toolkits (wsdl2java / java2wsdl, etc.) Propriétaires (non normalisés) Ex (Axis) : <PATH-TO-AXIS2>/bin/wsdl2java.sh Ex (JBoss) : <PATH-TO-JBOSS>/bin/wsconsume.sh 2 approches Approche Top-Down : WSDL =⇒ code (à remplir) + stubs. Approche identique aux RPC, RMI, etc. Approche Bottom-up : Web Service =⇒ WSDL 15/38 INSA - ASI InfoRep : WebServices Implémentation avec JBoss 16/38 (1/10) Annotations Java Description But : marquage d’éléments Java afin de leur ajouter une propriété Peuvent être utilisée sur n’importe quel type d’élément (package, class, attribut, méthode, paramètre, etc.) Plusieurs annotations peuvent être utilisées sur un même élément Utilisées à la compilation ou à l’exécution Utilisation : @ suivi du mot-clef correspondant à l’annotation L’API Java 5.0 propose 3 annotations : @Deprecated, @Override et @SuppressWarnings Déclaration et création de nouvelles annotations : comme une interface en utilisant le mot-clef @interface INSA - ASI InfoRep : WebServices Implémentation avec JBoss (2/10) Annotations Java Exemple public @interface MaNouvelleAnnotation { } Exemple @MaNouvelleAnnotation @SuppressWarnings("deprecation") public class maClasse { @UneAutreAnnotation(champ="type") public String texte = "Texte"; @Override @SuppressWarnings({"deprecation","unckeked"}) public String toString() { return this .texte; } } 17/38 INSA - ASI InfoRep : WebServices Implémentation avec JBoss (3/10) Serveur/Client avec JBoss Approche Bottom-up 1 Développer une interface (Description du service) 2 Développer une implémentation de cette interface (POJO : Plain Old Java Object) 3 Développer le Service Web (POJO + web.xml → archive.war) 4 Déployer le Service Web sur un serveur JBoss 5 Télécharger le fichier wsdl 6 Générer le Stub client 7 Développer le client 18/38 INSA - ASI InfoRep : WebServices Implémentation avec JBoss (4/10) Interface helloWebServices.HelloWorldWS.java package helloWebService; import import import import javax.jws.WebService; javax.jws.WebMethod; javax.jws.WebParam; javax.jws.soap.SOAPBinding; @WebService(name="HelloWorldWS") @SOAPBinding(style=SOAPBinding.Style.RPC) public interface HelloWorldWS { @WebMethod(action="sayHello") public String sayHello(@WebParam(name = "name") String name); } 19/38 INSA - ASI InfoRep : WebServices Implémentation avec JBoss (5/10) Implémentation POJO du service helloWebServices.HelloWorldWSImpl.java package helloWebService; import javax.jws.WebService; @WebService(endpointInterface="helloWebService.HelloWorldWS") public class HelloWorldWSImpl implements HelloWorldWS { @Override public String sayHello(String name) { return "Hello " + name + " !"; } } 20/38 INSA - ASI InfoRep : WebServices Implémentation avec JBoss (6/10) Déclaration du service META-INF/web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>HelloWorldWS</servlet-name> <servlet-class>helloWebService.HelloWorldWSImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorldWS</servlet-name> <url-pattern>/HelloWorldWS</url-pattern> </servlet-mapping> </web-app> 21/38 INSA - ASI InfoRep : WebServices Implémentation avec JBoss (7/10) Archivage et déploiement Archivage : jar -cf HelloWorldWebService.war WEB-INF Fichier HelloWorldWebService.war : HelloWorldWebService.war |_ WEB-INF | |_ web.xml | |_ classes | |_ helloWebServices | |_ HelloWorldWS.class | |_ HelloWorldWSImpl.class |_ META-INF |_ MANIFEST.MF Déploiement de HelloWorldWebService.war dans deploy 22/38 INSA - ASI InfoRep : WebServices Implémentation avec JBoss Récupération du WSDL (8/10) 23/38 INSA - ASI InfoRep : WebServices Implémentation avec JBoss (9/10) Stub client Récupération du stub client $JBOSS_HOME/bin/wsconsume.sh http://localhost:8080/ HelloWorldWebService/HelloWorldWS?wsdl Permet de télécharger le fichier wsdl de description du service et de générer à la volée les fichiers suivants : HelloWorldWS.class HelloWorldWSImplService.class À la compilation du client : javac -cp .:‘$JBOSS_HOME/bin/classpath.sh -c‘ ... 24/38 INSA - ASI InfoRep : WebServices Implémentation avec JBoss (10/10) Client client.Client.java package client; import hellowebservice.HelloWorldWS; import hellowebservice.HelloWorldWSImplService; public class Client { public static void main(String[] args) throws Exception { HelloWorldWS hello = (new HelloWorldWSImplService()).getHelloWorldWSImplPort(); System.out.println(hello.sayHello(args[0])); } } 25/38 INSA - ASI InfoRep : WebServices 26/38 Passage d’objets et exceptions Utilisation de javabeans Contrainte sur les passages d’objet : javabeans En argument comme en valeur en retour Constructeur sans argument Accesseurs et modifieurs sur les attributs (get et set sur chacun des attributs) À l’aide de wsconsume, génération de : ObjectFactory : pour créer des objets côté client Une classe par Objet transmis Gestion des exceptions Totalement transparente pour l’utilisateur INSA - ASI InfoRep : WebServices Passage d’objets et exceptions Interface institute.Secretariat.java package institute; import import import import javax.jws.WebService; javax.jws.WebMethod; javax.jws.WebParam; javax.jws.soap.SOAPBinding; @WebService(name="Secretariat") @SOAPBinding(style=SOAPBinding.Style.RPC) public interface Secretariat { @WebMethod(action="register") public Student register(@WebParam(name="candidate") Candidate candidate, @WebParam(name="year") int year) throws Exception; } 27/38 INSA - ASI InfoRep : WebServices 28/38 Passage d’objets et exceptions Implémentation POJO du service institute.SecretariatWS.java package institute; import javax.jws.WebService; @WebService(endpointInterface="institute.Secretariat") public class SecretariatWS implements Secretariat { @Override public Student register(Candidate candidate, int year) throws Exception { if (year<=0) throw new Exception("Parameter ’year’ must be strictly positive." ); return new Student(candidate.getName(), year); } } INSA - ASI InfoRep : WebServices Passage d’objets et exceptions Passage de javabeans institute.Candidate.java institute.Student.java package institute; package institute; public class Candidate { private String name; public class Student { private String name; private int year; public Candidate () { this.name = ""; } public Student() { this.name = ""; this.year = 0; } public Candidate (String name) { this.name = name; } public Student(String name, int year) { this.name = name; this.year = year; } public void setName(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setYear(int year) { this.year = year; } } public String getName() { return this.name; } public int getYear() { return this.year; } } 29/38 INSA - ASI InfoRep : WebServices Passage d’objets et exceptions Déclaration et déploiement du service META-INF/web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/webapp_2_3.dtd"> <web-app> <servlet> <servlet-name>UniversityWS</servlet-name> <servlet-class>institute.SecretariatWS</ servlet-class> </servlet> <servlet-mapping> <servlet-name>UniversityWS</servlet-name> <url-pattern>/UniversityWS</url-pattern> </servlet-mapping> </web-app> University.war University.war |_ WEB-INF | |_ web.xml | |_ classes | |_ institute | |_ Secretariat.class | |_ SecretariatWS.class | |_ Candidate.class | |_ Student.class |_ META-INF |_ MANIFEST.MF 30/38 INSA - ASI InfoRep : WebServices Passage d’objets et exceptions Stub client Récupération du stub client $JBOSS_HOME/bin/wsconsume.sh http://localhost:8080/University/ UniversityWS?wsdl Génération à la volée des fichiers : ObjectFactory.java package-info.java Candidate.java Student.java Secretariat.java SecretariatWS.java Remarques Seule la partie correspondant à un javabean est générée ! Les fichiers générés sont également compilés à la volée ; on peut en garder trace avec l’option ’-k’ 31/38 INSA - ASI InfoRep : WebServices Passage d’objets et exceptions Clase Candidate générée institute.Candidate.java (généré) /** * Sets the value of the name property. * * @param value * allowed object is * {@link String } * */ public void setName(String value) { this .name = value; } package institute; ... @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "candidate", propOrder = { "name" }) public class Candidate { protected String name; /** * Gets the value of the name property. * * @return * possible object is * {@link String } * */ public String getName() { return name; } } 32/38 INSA - ASI InfoRep : WebServices Passage d’objets et exceptions Client client.Client.java package client; import institute.*; import javax.xml.namespace.QName; import javax.xml.rpc.Service; import java.net.URL; public class Client { public static void main(String[] args) throws Exception { Secretariat secretariat = (new institute.SecretariatWSService()).getSecretariatWSPort(); Candidate Bob = new Candidate(); Bob.setName(args[0]); Student student = secretariat.register(Bob, Integer.parseInt(args[1])); System.out.println(student.getName() + " est inscrit dans la promotion " + student.getYear()); } } 33/38 INSA - ASI InfoRep : WebServices Alternative : Axis Apache Axis Description Développé par la fondation Apache Contribution d’HP, IBM, Macromédia, etc. open-source Java, donc multi-plateformes Conforme aux dernières évolutions de SOAP Peut être utilisé avec tout serveur Web J2EE http://ws.apache.org/axis2 axis2.war : utilisation conjointe avec tomcat (Attention : incompatible avec les dernières versions de JBoss qui utilisent leur propre système de Web Services) serveur autonome 34/38 INSA - ASI InfoRep : WebServices Alternative : Axis Développement avec Axis2 Méthode 1 Développer un service POJO 2 Développer le Service Web (services.xml + POJO → archive) 3 Déployer le Service Web 4 Télécharger le fichier wsdl 5 Générer le Stub client 6 Implémenter le client 35/38 INSA - ASI InfoRep : WebServices 36/38 Alternative : Axis Stub client Récupération du stub client sh <PATH-TO-AXIS2>/bin/wsdl2java.sh -uri http://localhost:8080/axis2/ services/XXX?wsdl -p client.stubs -d adb Permet de télécharger le fichier wsdl de description du service et de générer à la volée les fichiers suivants : XXXStub.java XXXCallbackHandler.java À la compilation du client : -extdirs <PATH-TO-AXIS2>/lib/ À l’exécution du client : -Djava.ext.dirs=<PATH-TO-AXIS2>/lib/ Nécessite la version de développement d’Axis2 INSA - ASI InfoRep : WebServices Alternative : Axis Arguments Paramètres multiples Il faut initialiser les paramètres un par un (setParam0, setParam1) Contraintes sur les passages d’objet En argument comme en valeur en retour Nécessité d’avoir des accesseurs et modifieurs sur les attributs (get et set sur chacun des attributs) Utilisation de la classe XXXStub.ObjetTransmis, mais transtypage (cast) impossible ⇒ création d’un nouvel objet à la réception 37/38 INSA - ASI InfoRep : WebServices Références Services Web open Source : D. Ayala, C. Browne, V. Chopra, P. Sarang, K. Asphangar, T. McAllister Campus Press - ISBN : 2-7440-1507-5 Java Web Services : D. A. Chappell, T. Jewel O’Reilly - ISBN : 0-596-00269-6 http://community.jboss.org/wiki/jbossws-userguide 38/38