MASTER SSR - SERVICES WEB! Version 2011 L'objectif du TP est de: mettre en pratique un exemple simple de service Web, de programmer un service Web calculatrice, et son client. Introduction Nous proposons de mettre en pratique le cours dédié aux services Web par le biais d une séance qui consiste à programmer et implanter des services Web simples. Pour cela, les outils nécessaires sont les suivants: JDK 1.6 ou supérieur Glassfish 3 Metro Installation de NetBeans + Glassfish Téléchargement Téléchargez NetBeans 7.0 à l URL suivant: http://netbeans.org/ Choisissez le pack Java ou All. Installation Pour installer NetBeans, suivez les instructions. Environnement, lancement et test Il faut dans l onglet Services démarrer le serveur Glassfish. Pour tester si le serveur est bien lancé, ouvrez un navigateur, et testez l URL suivant: http://localhost:8080/ Installation de Metro Pour mettre en pratique les services Web, nous allons utiliser Metro. Normalement, la distribution Metro est incluse dans NetBeans. Si ce n est pas le cas, vous pouvez télécharger l archive à l URL suivant: https://metro.dev.java.net/ Une fois que vous avez téléchargé l archive, désarchivez le fichier en utilisant la commande suivante: java -jar metro-2_0.jar Il faut ensuite installer Metro. Il faut que Glassfish soit arrêté.! asadmin stop-domain domain1! ant -Das.home=chemin/vers/glassfish!!!! -f chemin/vers/metro/metro-on-glassfish.xml install! setenv AS_HOME chemin/vers/glassfish! setenv METRO_HOME chemin/vers/metro! asadmin start-domain domain1 Écrire un service Web Créez le fichier Java HelloService.java suivant. Pour que cette classe devienne un service Web, il faut ajouter une annotation qui permette de promouvoir les méthodes de la classe HelloService comme des opérations du service.
package master.hello; import javax.jws.webservice; @WebService public class HelloService {! public String affichehello(string nom) {!! return "Hello " + nom;! Déploiement du service Nous allons maintenant déployer le service dans Glassfish. Pour cela, utilisez l option Deploy de NetBeans. Une fois cette action effectuée, votre service est accessible à partir de Glassfish. Création d un client pour accéder au service Nous allons maintenant créer un client capable de discuter avec le service Web, en utilisant le protocole SOAP. On crée le fichier Java HelloClient.java: package master.helloclient; public class HelloClient { public static void main(string[] args) { try {!! HelloService port =!!!! new HelloServiceService().getHelloServicePort(); String resappelservice = port.affichehello(args[0]); System.out.println("Le resultat est: "+ resappelservice); catch (Exception ex) { System.out.println ("Exception: " + ex); Le client récupère le port sur lequel est disponible le service, puis lance l appel. Pour que cet appel puisse être exécuté, il faut au préalable donner au client la possibilité de contacter le service Web. Cela est expliqué dans la section suivante. Qu est-ce qui s est passé? Regardons la mécanique qui a été mise en place lors du déploiement du service et du client. Dans le répertoire Generated Sources (jax-ws), on remarque que six classes ont été créées: AfficheHello.java! AfficheHelloResponse.java! HelloService.java! HelloServiceService.java! ObjectFactory.java! package-info.java Ces classes ont été générées lors de la recherche du service, grâce à la présence du fichier WSDL. Elles permettent de gérer le message envoyé par le client, et la réponse du service.
Le fichier HelloServiceService.java est le plus intéressant. C est ce fichier qui fait le lien entre l appel du service dans le client, et l instance du service dans Glassfish. À partir du code du service, et du code du client, JAX-WS a généré des méthodes qui permettent au client d appeler le service simplement, et sans avoir à préciser l URL, le port et les opérations WSDL supportées par le service. Tout cela est fait automatiquement. Si on regarde le WSDL généré pour notre service, on se rend compte que l appel à la méthode Java affichehello() a été transformée dans son équivalent WSDL. Examinons le code WSDL. Le service est disponible à l URL http://localhost:8080/master/helloservice: <service name="helloserviceservice"> <port name="helloserviceport" binding="tns:helloserviceportbinding"> <soap:address location="http://localhost:8080/master/helloservice" />! </port> </service> Le binding décrit le format des messages et le protocole pour pouvoir communiquer avec le service. Ici, on utilise le protocole SOAP et le style document (on envoie juste les données). <binding name="helloserviceportbinding" type="tns:helloservice">! <soap:binding transport=" " style="document" />! <operation name="affichehello">!! <soap:operation soapaction="" />!! <input>!!! <soap:body use="literal" />!! </input>!! <output>!!! <soap:body use="literal" />!! </output>! </operation> </binding> Le porttype décrit le service en termes d opérations et de messages. Le service HelloService possède une opération, l opération affichehello, et deux messages: affichehello en input, affichehelloresponse en output. C est cet élément qui fait le lien avec la classe Java. <porttype name="helloservice">! <operation name="affichehello">!! <input message="tns:affichehello" />!! <output message="tns:affichehelloresponse" />! </operation> </porttype> Les messages faisant partie de l opération sont détaillés: paramètres, type des paramètres éventuellement (types complexes). <message name="affichehello"> <part name="parameters" element="tns:affichehello" /> </message> <message name="affichehelloresponse"> <part name="parameters" element="tns:affichehelloresponse" /> </message> SOAP Monitor Nous allons maintenant voir ce qui se passe lorsque le client appelle le service Web. Pour cela, on utilise un moniteur qui permet d intercepter les messages SOAP échangés entre le client et le service. Le moniteur va donc devenir un intermédiaire entre le client et le service. Pour pouvoir analyser les échanges de messages, il faut au préalable modifier le port sur lequel le client va envoyer les messages SOAP. Par défaut, le port utilisé est le port 8080 (celui de Glassfish). Pour que le message transite par le moniteur, on va désormais envoyer les messages SOAP sur le port 4040 (le port sur lequel le moniteur écoute). On modifie ainsi le client en rajoutant les instructions qui permettent d envoyer le message sur le port 4040. On obtient le code suivant:
package master.helloclient; import javax.xml.ws.bindingprovider; public class HelloClient { public static void main(string[] args) { try { HelloService port =!!! new HelloServiceService().getHelloServicePort(); // Modification du port: 4040 au lieu de 8080 BindingProvider bp = (BindingProvider) port; String addresse =!!! (String)bp.getRequestContext().!!!! get(bindingprovider.endpoint_address_property); addresse = addresse.replacefirst("8080", "4040"); bp.getrequestcontext().put(!!! BindingProvider.ENDPOINT_ADDRESS_PROPERTY, addresse); String resappelservice = port.affichehello(args[0]); System.out.println("Le resultat est: "+ resappelservice); catch (Exception ex) { System.out.println ("Exception: " + ex); On recompile client: ant client On va ensuite lancer le moniteur. Sur le site du cours, vous trouverez l archive contenant les exécutables. Suivant que l on utilise Unix ou Windows, on lancera dans le répertoire bin le script wsmonitor.sh ou wsmonitor.bat. Enfin, on ré-exécute le client: java master.helloclient.helloclient Olivier Et on obtient les informations sur les échanges de messages entre le client et le service dans le moniteur.
Exercice 2 En suivant le modèle précédent, écrire un service Web qui permette de simuler une calculatrice 2 opérations (addition, soustraction) sur les entiers. Déployez le service. Écrire ensuite le client qui appelle le service Calculatrice grâce au protocole SOAP. Exercice 3 En suivant le modèle précédent, écrire un service Web qui permette de simuler un service Web qui permet de traduire des mots du français vers l anglais. Déployez le service. Écrire ensuite le client qui appelle le service Traducteur grâce au protocole SOAP.