Web services en Java (services Web) Jean-marc Farinone Web services (services web) : qu'est ce ? ❚ Une architecture orientée objet et distribuée où les messages sont en syntaxe XML. ❚ Une définition : Les Services Web sont des fonctions accessibles par le protocole HTTP. La syntaxe utilisée est XML (SOAP) ❚ Ce n'est pas une technologie Java mais spécifiée par le W3C (http://www.w3.org/2002/ws/) ❚ Mais Java EE propose une API pour faire des web services (http://java.sun.com/webservices/). 2 Un service Web ❚ Un service web est identifié par une description (son "contrat") en XML. Plus précisément en WSDL ❚ Ce contrat représente la structure SOAP/XML du service Web. ❚ Il est nécessaire de faire référence à ce contrat WSDL du service Web si on désire l’utiliser (le consommer) . ❚ Ce contrat WSDL est visible en ajoutant "?WSDL" à la fin de l'url où se trouve le service Web. 3 Les architectures distribuées annuaire n o i t a ce ic l n b o u n p n . a 1 e n d'u 2. recherche d'un service fournisseur 3. mise en correspondance client de services 4 Les termes utilisés ❚ Fournisseur de service publie une annonce décrivant les services qu'il fournit = un "provider" ❚ annuaire = un "registry" ❚ un client demandeur (acheteur) d'un service = un "requester" ❚ une mise en relation entre client et fournisseur de service = un "binding" 5 Une architecture standardisée ❚ C'est une architecture orientée services ❚ = SOA = Service Oriented Architecture ❚ = un ensemble de protocoles et de composants logiciels pour utiliser une architecture orientée services ❚ Qui définit donc : le format des messages, les spécifications pour définir un client, un fournisseur de services, l'accès au service d'annuaire, la communication entre client et fournisseur de services, etc. 6 Services web (= web services) ❚ WSDL = Web Services Description Language = format XML pour décrire un service web ❚ SOAP = Simple Object Access Protocol = protocole d'envoi de messages formatés en XML entre clients et serveur web services ❚ La couche transport utilisé est soit HTTP (d'où le nom de web services) soit SMTP (i.e. le mail) ❚ échange de messages synchrones (en attente de réponse) ou asynchrone (publication, lecture de réponse plus tard) ❚ UDDI = Universal Description Discovery and Integration = annuaire de services pour utiliser les services Web. 7 Un environnement pour des WS : Axis ❚ Page d'accueil : http://ws.apache.org/axis/ ❚ Axis est un environnement de développement pour WS (classes pour faire des services et clients WS) et d'exécution mais aussi une application Web. ❚ On peut le télécharger à partir de l'URL ci dessus. Choisir la version axis 1.4 et la version .zip. Après extraction mettre l'application web (qui se trouve dans webapps de l'archive) sous tomcat. ❚ Voir tutorial d'axis à http://ws.apache.org/axis/java/user-guide.html 8 Développement d'un client et serveur WS ❚ Le serveur sera encapsulé dans l'appli web Axis. ❚ Le client est un programme Java ❚ Un serveur complet : Reponse.jws public class Reponse { public String reponds(String st) { return "bonjour " + st; } public String disCoucou() { return "Coucou "; } } ❚ Ben oui c'est une classe Java. Le fichier doit avoir pour extension .jws 9 Le serveur WS Reponse.jws ❚ Il est placé dans l'application web Axis (sous la racine de cette application web) ❚ Qui, a la première utilisation, va compiler ce fichier Java, exécuter la méthode appelée et retourner le résultat (si tout se passe bien !) ❚ Une manière d'accéder à ce Web Service et, dans un client web, de demander la page d'URL : http://localhost:8080/axis/Reponse.jws ❚ Une démonstration SVP. OK ! Attention, chrome n'affiche pas le XML. Utiliser IE par exemple. ❚ Pourquoi cela fonctionne ? ❚ Réponse : en fait tout ce qui se termine par .jws est traité par la servlet AxisServlet (voir le web.xml de l'application web Axis) 10 Le client WS HelloClient.java package hello; import import import import import org.apache.axis.client.Call; org.apache.axis.client.Service; org.apache.axis.encoding.XMLType; org.apache.axis.utils.Options; javax.xml.rpc.ParameterMode; public class HelloClient { public static void main(String [] args) throws Exception { Options options = new Options(args); String endpoint = "http://localhost:" + options.getPort() + "/axis/Reponse.jws"; args = options.getRemainingArgs(); if (args == null || args.length != 1) { System.err.println("Usage: java HelloClient [nom]"); return; } String nom = args[0]; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName( "reponds" ); call.addParameter( "st", XMLType.XSD_STRING, ParameterMode.IN ); call.setReturnType( XMLType.XSD_STRING ); String ret = (String) call.invoke( new Object [] { nom }); System.out.println("resultat retourné } } : \n" + ret); 11 Le client WS HelloClient2.java package hello; import import import import import org.apache.axis.client.Call; org.apache.axis.client.Service; org.apache.axis.encoding.XMLType; org.apache.axis.utils.Options; javax.xml.rpc.ParameterMode; public class HelloClient2 { public static void main(String [] args) throws Exception { Options options = new Options(args); String endpoint = "http://localhost:" + options.getPort() + "/axis/Reponse.jws"; args = options.getRemainingArgs(); Service Call service2 = new Service(); call2 = (Call) service2.createCall(); call2.setTargetEndpointAddress( new java.net.URL(endpoint) ); call2.setOperationName( "disCoucou" ); call2.setReturnType( XMLType.XSD_STRING ); String ret2 = (String) call2.invoke(new Object [] { } ); System.out.println("resultat retourné : \n" + ret2); } } 12 Et XML (SOAP) dans tout çà ? ❚ Nous n'avons fait que (!) de la programmation Java. ❚ Quid de SOAP ? ❚ En fait les messages échangés entre le client et le serveur WS sont en SOAP. ❚ Si, si. 13 TCPMonitor : tcpmon ❚ Axis propose un outil qui permet de voir les messages TCP échangés entre un client et un serveur : TCPMonitor ❚ Il suffit d'indiquer que le client envoit les messages à ... TCPMonitor, que TCPMonitor envoit les messages au serveur, et tout échange entre client et serveur est tracé dans cet outil. ❚ On lance cet outil par : java org.apache.axis.utils.tcpmon 14 Utilisation de TCPMonitor 1/4 ❚ Le client est programmé par : String endpoint = "http://localhost:7777" + "/axis/Reponse.jws"; ... Service service2 = new Service(); Call call2 = (Call) service2.createCall(); call2.setTargetEndpointAddress( new java.net.URL(endpoint) ); .... ❚ Lorsque TCPMonitor est lancé on obtient le premier écran : 15 Utilisation de TCPMonitor 2/4 ❚ Indiqué le port écouté dans le champ de texte qui suit dans Listen Port #. Ici 7777. ❚ Et cliquer le bouton Add 16 Utilisation de TCPMonitor 3/4 ❚ Dans le nouvel onglet obtenu, cocher XML Format (et Switch Layout). ❚ Puis (compiler et) lancer le client. ❚ Les messages véhiculés entre client et serveur sont affichés. 17 Utilisation de TCPMonitor 4/4 18 Bibliographie Web services ❚ http://fr.wikipedia.org/wiki/Service_Oriented_ Architecture ❚ http://java.sun.com/javaee/5/docs/tutorial/doc /bnayk.html : la partie du Java EE 5 tutorial consacrée aux services web (utilisant JAX-WS et les annotations) ❚ http://www.w3.org/2002/ws/desc/ : page d'accueil du "Web Services Description Working Group" ❚ http://ws.apache.org/axis/ : implémentation open source Axis pour construire des services web ❚ http://www.xmethods.com/ : site de web services 19 Fin 20