Services Web - e
Transcription
Services Web - e
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/