You are on page 1of 38

INSA - ASI

InfoRep : WebServices

1/38

Informatique Rpartie
Web Services Alexandre Pauchet
INSA Rouen - Dpartement ASI
BO.B.RC.18, pauchet@insa-rouen.fr

INSA - ASI

InfoRep : WebServices

2/38

Plan
1

Introduction SOAP WSDL Implmentation avec JBoss Passage dobjets et exceptions Alternative : Axis Rfrences

INSA - ASI

InfoRep : WebServices

3/38

Introduction
Objectif

(1/4)

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 donnes Mode RPC sur Internet

INSA - ASI

InfoRep : WebServices

4/38

Introduction
Vocabulaire

(2/4)

Services Web : composant logiciel distribu qui utilise le protocole internet pour le transport des requtes (HTTP ou SMTP) et XML pour le formatage des donnes UDDI (Universal Description, Discovery and Integration) : annuaire des services web WSDL (Web Services Description Language) : langage reposant sur XML qui permet de dcrire un service web SOAP (Simple Object Access Protocol) : protocole de Service Web avec tat (dvelopp par Microsoft, DevelopMentor et UserlanSoftware) XML-RPC : protocole de Service Web sans tat (dvelopp par Dave Winer de Frontier et Userland)

INSA - ASI

InfoRep : WebServices

5/38

Introduction

(3/4)

XML-RPC versus SOAP

XML-RPC est une spcication et un ensemble dimplmentations permettant de faire du RPC avec http et le langage XML, exactement de la mme faon que SOAP. En fait les histoires de XML-RPC et de SOAP sont intimement lies. lorigine XML-RPC tait appel informellement SOAP par ces concepteurs dont linstigateur tait Dave Winer. Les premiers dveloppement taient fait en collaboration entre les quipes de UserLand, DevelopMentor et Microsoft. Mais du par la tournure des choses, Dave Winer dcide de sparer sa spcication 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. Aujourdhui SOAP supporte plus de fonctionnalits que XML-RPC (pas toujours utiles ?) et cest une spcication en devenir alors que XML-RPC est ge.

Jean-Marc Pierson http://www.if.insa-lyon.fr/chercheurs/jmpierson/Reseau4IF/ Projets/ProgrammationDistribuee/soap/soap.htm

INSA - ASI

InfoRep : WebServices

6/38

Introduction
Acteurs

(4/4)

Nombreux acteurs
Microsoft .Net Apache : Axis (2), CXF Sun : JAX-WS et Metro JBoss Autres implmentations open-source etc. Interoprabilit
Services des uns utilisables par les autres WS-I.org : Web Service Interoperability organization

INSA - ASI

InfoRep : WebServices

7/38

SOAP

(1/5)

Description

Organisation dun message SOAP


Requte HTTP Entte HTTP POST /soap Contenu/longueur Requte SOAP Enveloppe SOAP Entte Corps

INSA - ASI

InfoRep : WebServices

8/38

SOAP

(2/5)

Exemple de requte SOAP

Requte 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>

INSA - ASI

InfoRep : WebServices

9/38

SOAP

(3/5)

Rponse SOAP

Rponse SOAP une requte 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>

INSA - ASI

InfoRep : WebServices

10/38

SOAP

(4/5)

Srialisation des donnes

Srialisation des donnes


SOAP utilise les types dnis dans XML Schema :
Cf. http://www.w3.org/TR/xmlschema-2/ Cf. Cours de Document On a donc la possibilit de srialiser :
des types simples (prs dune quarantaine) des structures (xs:complexType)

On a aussi la possibilit de srialiser des tableaux en utilisant un schema qui dni llment Array et lattribut arrayType :
http://www.w3.org/2001/09/soap-encoding

INSA - ASI

InfoRep : WebServices

11/38

SOAP

(5/5)

INSA - ASI

InfoRep : WebServices

12/38

WSDL

(1/4)

Description

Fichier XML dcrivant un service web


Oprations (services) disponibles Accession (addresse, protocole, etc.) Format des messages changs entre client et serveur
Pour invoquer le service Pour interprter un rsultat

Rien sur sa smantique (ce quil fait)

INSA - ASI

InfoRep : WebServices

13/38

WSDL

(2/4)

Interface/Implmentation

Description WSDL
Des types sont utiliss dans des messages, associs dans des portTypes, relis un protocole par des bindings formant des Services Web.

INSA - ASI

InfoRep : WebServices

14/38

WSDL
Contenu

(3/4)

types : Contient les dnitions de types utilisant un systme de typage (comme XSD) message : Dcrit les noms et types dun ensemble de champs transmettre (Paramtres dune invocation, valeur du retour, etc.) portType : Dcrit un ensemble doprations. Chaque opration a 0 ou 1 message en entre, 0 ou plusieurs messages en sortie binding : Spcie une liaison dun <porttype> un protocole concret (SOAP1.1, HTTP1.1, MIME, etc.). Un <porttype> peut avoir plusieurs liaisons ! port : Spcie un point dentre (endpoint) comme la combinaison dun <binding> et dune adresse rseau service : Une collection de points dentre (endpoint) relatifs

INSA - ASI

InfoRep : WebServices

15/38

WSDL
Outils

(4/4)

Gnrateur WSDL partir de dploiements SOAP ou EJB, Gnrateur de proxy SOAP partir de WSDL Toolkits (wsdl2java / java2wsdl, etc.)
Propritaires (non normaliss) 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

INSA - ASI

InfoRep : WebServices

16/38

Implmentation avec JBoss


Annotations Java

(1/10)

Description
But : marquage dlments Java an de leur ajouter une proprit Peuvent tre utilise sur nimporte quel type dlment (package, class, attribut, mthode, paramtre, etc.) Plusieurs annotations peuvent tre utilises sur un mme lment Utilises la compilation ou lexcution Utilisation : @ suivi du mot-clef correspondant lannotation LAPI Java 5.0 propose 3 annotations : @Deprecated, @Override et
@SuppressWarnings

Dclaration et cration de nouvelles annotations : comme une interface en utilisant le mot-clef @interface

INSA - ASI

InfoRep : WebServices

17/38

Implmentation avec JBoss


Annotations Java

(2/10)

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; } }

INSA - ASI

InfoRep : WebServices

18/38

Implmentation avec JBoss


Serveur/Client avec JBoss

(3/10)

Approche Bottom-up
1 2

Dvelopper une interface (Description du service) Dvelopper une implmentation de cette interface (POJO : Plain Old Java Object) Dvelopper le Service Web (POJO + web.xml archive.war) Dployer le Service Web sur un serveur JBoss Tlcharger le chier wsdl Gnrer le Stub client Dvelopper le client

4 5 6 7

INSA - ASI

InfoRep : WebServices

19/38

Implmentation avec JBoss


Interface

(4/10)

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); }

INSA - ASI

InfoRep : WebServices

20/38

Implmentation avec JBoss


Implmentation POJO du service

(5/10)

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 + " !"; } }

INSA - ASI

InfoRep : WebServices

21/38

Implmentation avec JBoss


Dclaration du service

(6/10)

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>

INSA - ASI

InfoRep : WebServices

22/38

Implmentation avec JBoss


Archivage et dploiement

(7/10)

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 Dploiement de HelloWorldWebService.war dans deploy

INSA - ASI

InfoRep : WebServices

23/38

Implmentation avec JBoss


Rcupration du WSDL

(8/10)

INSA - ASI

InfoRep : WebServices

24/38

Implmentation avec JBoss


Stub client

(9/10)

Rcupration du stub client


$JBOSS_HOME/bin/wsconsume.sh http://localhost:8080/ HelloWorldWebService/HelloWorldWS?wsdl

Permet de tlcharger le chier wsdl de description du service et de gnrer la vole les chiers suivants :
HelloWorldWS.class HelloWorldWSImplService.class

la compilation du client :
javac -cp .:$JBOSS_HOME/bin/classpath.sh -c ...

INSA - ASI

InfoRep : WebServices

25/38

Implmentation avec JBoss


Client

(10/10)

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])); } }

INSA - ASI

InfoRep : WebServices

26/38

Passage dobjets et exceptions


Utilisation de javabeans

Contrainte sur les passages dobjet : javabeans


En argument comme en valeur en retour Constructeur sans argument Accesseurs et modieurs sur les attributs (get et set sur chacun des attributs) laide de wsconsume, gnration de :
ObjectFactory : pour crer des objets ct client Une classe par Objet transmis

Gestion des exceptions


Totalement transparente pour lutilisateur

INSA - ASI

InfoRep : WebServices

27/38

Passage dobjets 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; }

INSA - ASI

InfoRep : WebServices

28/38

Passage dobjets et exceptions


Implmentation 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

29/38

Passage dobjets et exceptions


Passage de javabeans

institute.Candidate.java
package institute; public class Candidate { private String name; public Candidate () { this.name = ""; } public Candidate (String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return this.name; } }

institute.Student.java
package institute; public class Student { private String name; private int year; public Student() { this.name = ""; this.year = 0; } public Student(String name, int year) { this.name = name; this.year = year; } public void setName(String name) { this.name = name; } public void setYear(int year) { this.year = year; } public String getName() { return this.name; } public int getYear() { return this.year; } }

INSA - ASI

InfoRep : WebServices

30/38

Passage dobjets et exceptions


Dclaration et dploiement 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

INSA - ASI

InfoRep : WebServices

31/38

Passage dobjets et exceptions


Stub client

Rcupration du stub client


$JBOSS_HOME/bin/wsconsume.sh http://localhost:8080/University/ UniversityWS?wsdl

Gnration la vole des chiers :


ObjectFactory.java package-info.java Candidate.java Student.java Secretariat.java SecretariatWS.java

Remarques
Seule la partie correspondant un javabean est gnre ! Les chiers gnrs sont galement compils la vole ; on peut en garder trace avec loption -k

INSA - ASI

InfoRep : WebServices

32/38

Passage dobjets et exceptions


Clase Candidate gnre

institute.Candidate.java (gnr)
package institute; /** * Sets the value of the name property. * * @param value * allowed object is * {@link String } * */ public void setName(String value) { this .name = value; } }

...
@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; }

INSA - ASI

InfoRep : WebServices

33/38

Passage dobjets 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()); } }

INSA - ASI

InfoRep : WebServices

34/38

Alternative : Axis
Apache Axis

Description
Dvelopp par la fondation Apache Contribution dHP, IBM, Macromdia, etc. open-source Java, donc multi-plateformes Conforme aux dernires 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 dernires versions de JBoss qui utilisent leur propre systme de Web Services) serveur autonome

INSA - ASI

InfoRep : WebServices

35/38

Alternative : Axis
Dveloppement avec Axis2

Mthode
1 2 3 4 5 6

Dvelopper un service POJO Dvelopper le Service Web (services.xml + POJO archive) Dployer le Service Web Tlcharger le chier wsdl Gnrer le Stub client Implmenter le client

INSA - ASI

InfoRep : WebServices

36/38

Alternative : Axis
Stub client

Rcupration 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 tlcharger le chier wsdl de description du service et de gnrer la vole les chiers suivants :
XXXStub.java XXXCallbackHandler.java

la compilation du client : -extdirs <PATH-TO-AXIS2>/lib/ lexcution du client : -Djava.ext.dirs=<PATH-TO-AXIS2>/lib/ Ncessite la version de dveloppement dAxis2

INSA - ASI

InfoRep : WebServices

37/38

Alternative : Axis
Arguments

Paramtres multiples
Il faut initialiser les paramtres un par un (setParam0, setParam1)

Contraintes sur les passages dobjet


En argument comme en valeur en retour Ncessit davoir des accesseurs et modieurs sur les attributs (get et set sur chacun des attributs) Utilisation de la classe XXXStub.ObjetTransmis, mais transtypage (cast) impossible cration dun nouvel objet la rception

INSA - ASI

InfoRep : WebServices

38/38

Rfrences

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 OReilly - ISBN : 0-596-00269-6

http://community.jboss.org/wiki/jbossws-userguide

You might also like