Professional Documents
Culture Documents
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)
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 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.
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
INSA - ASI
InfoRep : WebServices
8/38
SOAP
(2/5)
INSA - ASI
InfoRep : WebServices
9/38
SOAP
(3/5)
Rponse SOAP
INSA - ASI
InfoRep : WebServices
10/38
SOAP
(4/5)
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
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
(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
(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
(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
(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
(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
(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
(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
(8/10)
INSA - ASI
InfoRep : WebServices
24/38
(9/10)
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
(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
INSA - ASI
InfoRep : WebServices
27/38
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
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
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
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
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
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
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
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)
INSA - ASI
InfoRep : WebServices
38/38
Rfrences
http://community.jboss.org/wiki/jbossws-userguide