Alternative : Axis

publicité
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
Téléchargement