Services Web - e

publicité
Services Web
Introduction
Définition du W3C

Un Service web est une application distribuée

Il est identifié par un URI (Uniform Resource Identifier)


Ses interfaces et binding sont définis, décrits et
découverts par des artefacts XML
Il supporte des interactions directes avec d'autres
applications

En utilisant des messages XML

Via les protocoles communication de l'Internet
Les technologies dominantes
aujourd'hui

Application Web
−
−
Interaction humaine
Composition de tiers
DB Server, App Server, Web Server, Browser

Déclinaison JAVA

−
JAVA EE, JAVA SE et JAVA ME
Les technologies dominantes
aujourd'hui

Application Services web
−
−
Interaction entre applications
Composition de tiers
Bus de services, DB Server, App Server, Web
Server, Browser, XML, WSDL, SOAP, UDDI

Déclinaison JAVA

−
JAVA EE, JAVA SE, JAVA ME
Caractéristiques








Entièrement basé sur XML
Orienté message
Indépendant des langages de programmation
Peut être dynamiquement découvert
Peut être dynamiquement assemblé et agrégé
Accédé via Internet
Faiblement couplé
Basé sur des standards
Standards

SOAP
−

WSDL
−

Web Service Description Language
UDDI
−

Simple Object Access Protocol
Universal Description Discovery and Integration
ebXML
−
Electronic Business using eXtensible Markup
Language
Architecture
Annuaire
de services
découverte
enregistrement
Service
invocation
Médias d'accès aux services
livraison
Assemblage de services
clients
Service
macroscopique
Orchestration
BPM
Service
microscopique
Service
microscopique
Service
microscopique
Agrégation de services
Service
clients
Portail
Service
Service
Pourquoi les services web

Interopérabilité
−

Économique
−

Connexion entre réseaux hétérogènes
Préserve l'existant, pas de forte intégration
Automatique
−
Pas d'interaction humaine
Pourquoi les services web

Accessibles
−

Disponibles
−

Exposés et accessibles sur le Web
Services disponibles sur tous les médias,
n'importe où, n'importe quand
Sans limite
−
Pas de limite du champ des applications et de
leur nombre
Types d'application



B2C
−
Business To Consumer
−
Applications pour les consommateurs
B2B
−
Business To Business
−
Applications pour les entreprises
A2A
−
Applications intra-entreprise
−
Intégration d'applications
Limites des middlewares
historiques

Difficultés à passer au Web
−
−

Trop de contraintes côté client
−
−



Protocoles hétérogènes (IIOP, RMI, DCOM)
Problèmes avec les firewall
Doit posséder les souches (Stub)
Difficulté à découvrir dynamiquement les services
Complexité (CORBA, EJB)
Pérénité
Coût
Les intergiciels historiques

Java RMI
−
−
−

CORBA / IIOP
−
−
−

Mono-langage: Java, multi-plate-forme (JVM)
SUN MICROSYSTEM
Pas réaliste pour une application industrielle (performance, sécurité...)
Multi-langage, multi-plate-formes, multi-vendeurs
OMG
Installation "coûteuse" si on doit acheter un ORB
DCOM
−
−
−
Multi-langages, plate-forme Win32, propriétaire
Microsoft
Faible diffusion


Pas disponible sur MacOS, NT3.51, WinCE
Protocole orienté connexion
−

Échange de nombreux paquets pour créer/maintenir une session
Coûteux sur UNIX, VMS ou NT
Services Web
Architecture technique
Rôle, opération et objet
service
Registry
Find
Service
Description
Publish
WSDL, UDDI
WSDL, UDDI
SOAP
Service
Service
Requestor
Bind
Service
Provider
Service
Description
SOAP
Introduction
SOAP

Simple Object Access Protocol
−
−
−
Est un protocole léger pour l'échange d'informations
dans un environnement décentralisé et distribué.
C'est un protocole basé sur XML.
Composé de 4 parties :
Une enveloppe qui définit un framework

Des règles d'encodage

Une convention de représentation des requêtes et des
réponses (RPC)

La liaison avec les protocoles de transport

Comparaison

SOAP a la même fonction que
−
−

SOAP définit les règles d'encodage des
informations qui transitent sur le réseau
−

IIOP pour CORBA
JRMP pour RMI
La façon dont elles sont sérialisées
SOAP est un protocole de « câblage »
−
Avec encodage représenté en XML
SOAP et les protocoles de
transport


SOAP a été conçu et défini pour HTTP
Il peut être acheminé par d'autres protocoles
−
Protocoles existants

−
SMTP/MIME, MOM/JMS, ...
Protocoles à venir
SOAP sur HTTP


Utilise le mode POST Requête/Réponse
Requête
−
−
Type MIME: /text/xml
Champs d'entête supplémentaire de la requête
Encodage SOAP

Un message SOAP contient des données
typées. Il faut donc définir un moyen d'encoder
ces données.
−
Value : valeur d'une donnée
Simple value : string, integers, etc

Compound value : array, struct, etc

−
Type (d'une value)
Simple Type

Compound Type

Exemple : Simple Types
Type (XML Schema)
<element name="age" type="int"/>
Type XML Schema
<element name="color">
<simpleType base="xsd:string">
<enumeration value="Green"/>
<enumeration value="Blue"/>
</simpleType>
</element>

Valeurs
<age>45</age>
Construction de Type XML Schema
<color>Blue</color>

SOAP et RPC

Pour réaliser un RPC SOAP, il faut:
−
−
−


L'URI de l'objet cible
Le nom de la méthode
Les paramètres de la méthode
SOAP s'appuie sur le protocole de transport
Le nom de la méthode et les paramètres
sont encodés dans le message SOAP sous
forme de structure
WSDL
Introduction
Caractéristiques


Un langage XML pour décrire les Services Web
Un service est décrit comme
−
Un ensemble de points de communication (ports)

−
Endpoint
Un Endpoint est composé de 2 parties
Une définition abstraite d’opérations et de messages

Une liaison concrète (Binding) à un protocole réseau

Comparaison

WSDL a la même fonction que
−
−
IDL (Interface Definition Language) pour CORBA
Une POJI pour RMI Java
Pourquoi WSDL ?

Permet l’automatisation des communications
entre les acteurs WS
−
−


Les machines peuvent lire WSDL
Les machine peuvent invoquer un service décrit en
WSDL
WSDL peut être découvert à l’aide d’annuaires
Permet le contrôle par des vérifications de
conformité
Éléments WSDL







Types
Message
Opération
Port Type
Binding
Port
Service
JAX-WS 2.0
Introduction
Spécifications




Java API for XML Web Services (JSR 224)
Final draft: Octobre 2005
Remplace JAX-RPC
Standards
−
−
−
−
−
−
−
−
JAXB
SOAP 1.2
WSDL 2.0
WS-I Basic Profile 1.1
Metadata Facility for the Java Programming Language (JSR 175)
Web Services Metadata for the Java Platform (JSR 181)
Implementing Enterprise Web Services (JSR 109)
Web Services Security (JSR 183)
Pourquoi JAX-WS ?


Pour simplifier le développement d’applications
Services Web avec Java
Pour permettre à n’importe quel client d’utiliser
le service
−

Grâce au respect du standard WS-I Basic Profile
Pour accélérer le développement à l’aide d’une
librairie d’annotations
−
−
Transforme rapidement une classe POJO en service
Pas besoin de descripteur de déploiement
Composants de JAX-WS

JAXB
−
−
−

Java Architecture for XML Binding
Couche qui réalise la conversion de XML en Java
Définit le lien entre le schéma XML de SOAP et le
code Java
SAAJ
−
−
SOAP Attachments API for Java
Permet d’attacher du XML à un message SOAP

Précisément créer, peupler et modifier les messages
SOAP
Solutions JAX-WS

JAVA EE 5
−
EJB3

−
WEB


Un Session Bean Stateless peut être exposé comme un
service
Un service JAX-WS peut être pris en charge par une
SERVLET
JAVA SE 6
−
−
Un service JAX-WS peut être développé et publié
dans l’environnement standard JAVA
A partir de JAVA version 6 la JVM embarque un
serveur HTTP
Développer en JAX-WS

Contract first (top-down)
−
−

Commencer par un fichier WSDL et générer les
classes qui implémentent le service
WSIMPORT
Code first (bottom-up)
−
−
Commencer par une classe POJO, ajouter les
annotations et générer le fichier WSDL et
l’interface Java
WSGEN
Annotations

@WebService
−


Annotation pour une classe ou une interface
Marque une SEI (Service Endpoint Interface)
Attributs
−
−
−
−
−
−
endpointInterface
name
portName
serviceName
targetNamespace
wsdlLocation
Annotations

@WebMethod
−
−

Configure une méthode exposée comme une
opération d’un Service Web
Pas de gestion d’exception de type RemoteException
Attributs
−
−
−
action
exclude
operationName
Annotations

@WebParam
−

Configure le mapping d’un paramètre d’un message
Attributs
−
−
−
−
−
header
mode
name
partName
targetNamespace
Annotations

@WebResult
−

Configure le mapping d’une valeur de retour
Attributs
−
−
−
−
header
name
partName
targetNamespace
Exemple
@WebService(targetNamespace = "http://duke.example.org", name="AddNumbers")
@SOAPBinding(style=SOAPBinding.Style.RPC, use=SOAPBinding.Use.LITERAL)
public interface AddNumbersIF {
@WebMethod(operationName="add", action="urn:addNumbers")
@WebResult(name="return")
public int addNumbers(
@WebParam(name="num1") int number1,
@WebParam(name="num2") int number2) throws AddNumbersException;
}
Annotations utilisées




JSR 181: Web Services Metadata for the Java Platform
JSR 222: Java Architecture for XML Binding (JAXB)
JSR 224: Java API for XML Web Services (JAX-WS)
JSR 250: Common Annotations for the Java Platform
JAX-WS
JAVA SE 6
JVM 1.6




A partir de la version 1.6 la JVM embarque
un serveur HTTP
Supporte le standard JAX-WS
Il est possible d'y publier des Services Web
API de programmation
−
Client

−
−

Classe Service
Serveur
Classe Endpoint
Injection de dépendance
−
@Resource WebServiceContext
Classe POJO


Implémentation des services par une classe
POJO annotée avec JAX-WS
Implémentation possible avec une interface
POJI et une classe POJO annotées
−
Annotation minimum


@WebService
Publication par la méthode
−
−
Endpoint.publish()
Arrêt du service par la méthode stop()
JAX-WS
Serveur JAVA EE
EJB3



Session Bean Stateless
Mêmes annotations que pour une classe
POJO JAX-WS
Injection de dépendance
−
@WebServiceRef

−
Permet de récupérer un objet proxy du service
@Resource

Permet de récupérer le WebServiceContext d'un
service
Handler
Introduction
Framework



Côté client
Côté serveur
Filtrage de message
−
−
Pre-processing et post-processing
Peut être organisé en chaîne (plusieurs handlers)


Annotation @Handlerchain(file=''handlerchain.xml'')
Deux types de Handler
−
Logique

−
Pour les messages XML
Protocole

Pour les protocoles, SOAP par exemple
Exemple de fichier de
configuration
<handler-chains xmlns:jws="http://java.sun.com/xml/ns/javaee";>
<handler-chain>
<handler>
<handler-class>org.test.myHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>
Exemple de classe Handler
public class ValidationHandler implements SOAPHandler<SOAPMessageContext> {
public boolean handleMessage(SOAPMessageContext ctx) {
SOAPMessage message = ctx.getMessage();
...
}
}
JAX-WS
Clients
Client EJB3

Les Session Bean peuvent être clients d'un
service implémenté par un Session Bean
Stateless
−
−

A condition d'avoir la souche (Stub) dans son
classpath
−

Local
Distant
Obtenue avec wsimport
Injection de dépendance
−
−
@WebServiceRef
Pour obtenir le proxy ou le port
Exemple de Session Bean client
@Stateless
public class ClientWSBean implements ClientWS {
@WebServiceRef
EjbBeanServiceMessageService proxyws;
@Override
public String service(String arg) {
return proxyws.getEjbBeanServiceMessagePort().message(arg);
}
Client proxy

Utilise la souche générée par la compilation
wsimport
−

wsimport http://url/service?wsdl
Récupération du proxy
−
−
−
Instanciation de la classe XXXXService générée
Appel de la méthode getXXXXPort()
Invocation de l'opération
Exemple client proxy
public class Client {
public static void main(String args[]) {
MonServiceImplService svc = new MonServiceImplService();
MonServiceImpl proxy = svc.getMonServiceImplPort();
System.out.println(proxy.service());
}
}
Client « dynamique »


Pas besoin de la souche
Doit connaître le type du service
−


Doit connaître l'URL du service
Doit connaître le nom qualifié du service
−

Interface ou classe
QName
Utilise la classe Service
Exemple de client « dynamique »
public class ClientDynamique {
public static void main(String[] args) throws MalformedURLException {
URL wsdlURL =
new URL("http://localhost:8080/MonApplication/monservice?wsdl");
QName SERVICE_NAME =
new QName("http://service/", "MonServiceImplService");
Service service = Service.create(wsdlURL, SERVICE_NAME);
MonServiceImpl client = service.getPort(MonServiceImpl.class);
String resultat = client.service();
System.out.println(resultat);
}
}
Client avec Dispatch


Client dynamique
Interface de bas niveau
−

Interface
−

XML
Dispatch<T>
Méthodes
−
−
−
−
T invoke(T msg)
Response<T> invokeAsync(T msg)
Future<?> invokeAsync(T msg, AsyncHandler<T> h)
void invokeOneWay(T msg)
Exemple de client Dispatch (1)
public static void main(String[] args) throws MalformedURLException {
URL wsdlURL = new URL("http://localhost:8080/MonApplication/monservice?wsdl");
QName SERVICE_NAME = new QName("http://service/", "MonServiceImplService");
Service service = Service.create(wsdlURL, SERVICE_NAME);
QName portQName = new QName("http://service/","MonServiceImplPort");
Dispatch<Source> sourceDispatch = service.createDispatch(portQName, Source.class,
Service.Mode.PAYLOAD);
String request = "<ser:service xmlns:ser=\"http://service/\">"+"</ser:service>";
Source result = sourceDispatch.invoke(new StreamSource(new StringReader(request)));
String xmlResult=null;
try {
xmlResult = sourceToXMLString(result);
} catch (TransformerFactoryConfigurationError e) {e.printStackTrace(); }
catch (TransformerException e) {e.printStackTrace(); }
System.out.println("Received xml response: " + xmlResult);
}
Exemple de client Dispatch (2)
private static String sourceToXMLString(Source result1) throws TransformerFactoryConfigurationError,
TransformerException {
StreamResult result2 = new StreamResult(new ByteArrayOutputStream());
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(result1, result2);
ByteArrayOutputStream baos = (ByteArrayOutputStream) result2.getOutputStream();
String responseContent = new String(baos.toByteArray());
return responseContent;
Ressources



The Java EE 5 Tutorial
−
Part III Web Services
−
java.sun.com/javaee/5/docs/tutorial/doc/
W3C Recommendation 26 June 2007
−
WSDL
−
www.w3.org/TR/wsdl20/
W3C Recommendation 27 April 2007
−
SOAP 1.2
−
www.w3.org/TR/2007/REC-soap12-part1-20070427/
Téléchargement