Exercices « Web Services Java » 1 Robert Voyer
Transcription
Exercices « Web Services Java » 1 Robert Voyer
Exercices « Web Services Java » 1 Robert Voyer Accès aux services Web « Axis » Lancement et accès aux services web du fournisseur « Axis ». Lancement du fournisseur de services « Axis » Le serveur « Axis » est installé comme une application Web au sein du moteur de servlets et de JSPs « Tomcat ». Vous devez, pour accéder aux possibilités de « Axis », activer préalablement le serveur « Tomcat ». Pour cela, vous double-cliquez sur : <dossierInstallation>\Tomcat 4.1\bin\startup.bat Accès aux services déployés Pour vérifier la bonne installation et éventuellement accéder aux services web existants sur « Axis », vous tapez dans un navigateur : http://localhost:8080/axis Ensuite, vous pouvez cliquer sur « Validate » et « View » Exercices « Web Services Java » 2 Robert Voyer Initiation aux Services Web « Axis » Exercices illustrant le développement de base des Services Web sous Axis. Exercice Service1 : un premier service simple Un premier exercice qui affiche tout simplement le célèbre : HELLO WORLD Dans ce premier exercice, nous allons simplement nous remettre en tête les modes de développement d’applications Java. Remarque : Les phases de déploiement et de publication du service que vous allez développer sont automatisées. Etape 1 : définition de la classe du service La première étape consiste à définir la classe du service web qui retournera au client lchaîne de caractères « HELLO WORLD ». La définition de cette classe est la suivante : public class ServiceHelloWorld { public String message() { return “Hello World”; } } Utilisez un éditeur de texte simple (emacs sous Unix) ou NotePad sous Dos. Attention, vous devez sauvegardez votre classe sous le fichier portant le même nom et suffixé par « java » ! Ici, le fichier de sauvegarde sera donc : ServiceHelloWorld.java. Etape 2 : déploiement du service par fichier « JWS » La deuxième étape consiste à déployer le service au sein d’un fournisseur de services web. L’environnement d’exécution et de déploiement des services web que nous utilisons est l’outil « Axis ». Le premier mode de déploiement sous « Axis » que nous allons mettre en œuvre est le plus simple qui soit ; c’est le déploiement instantané par fichier « JWS ». Vous noterez qu’il n’est pas nécessaire de compiler le source java. Pour réaliser le déploiement, il suffit de copier le fichier « HelloWorld.java » (en le renommant « HelloWorld.jws ») dans le domaine applicatif de « Axis ». Le domaine application de « Axis » est : <dossierAxis>/webapps/axis Vous devez donc effectuer : copy HelloWorld.java <dossierAxis>\webapps\axis\HelloWorld.jws Vous êtes désormais en mesure d’accéder à votre service à l’URL suivante : http://localhost:8080/axis/HelloWorld.jws Vous devez alors constater que votre service a bien été déployé sur « Axis » en ayant en retour la page « html » suivante : There is a Web Service here Click to see the WSDL Exercices « Web Services Java » 3 Robert Voyer Si vous cliquez sur ce dernier lien, vous verrez la définition « WSDL » (générée automatiquement par « Axis ») de votre service web. Etape 3 : exécution du service par fichier « JWS » La dernière étape consiste à mettre en œuvre votre service qui est désormais accessible à travers tout le net ! Pour exécuter une méthode de votre service et obtenir la réponse « SOAP » correspondante, vous tapez l’expression suivante dans votre navigateur : http://localhost:8080/axis/HelloWorld.jws?method=message Par rapport à l’expression précédente, vous précisez ici le nom de la méthode à exécuter, sous la forme de la valeur de l’attribut « method ». La réponse affichée est le contenu « SOAP », c’est-à-dire un fichier « XML » dont voici un extrait : <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> - <messageResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <messageReturn xsi:type="xsd:string">Hello World</messageReturn> </messageResponse> </soapenv:Body> </soapenv:Envelope> Exercice Service2 : un deuxième service simple En procédant comme précédemment, on vous demande de définir un service web qui calcule de carré d’un nombre. Il y a deux différence par rapport à l’exercice précédent : Le service retourne cette fois-ci un nombre La méthode à invoquer possède un parameter. Pour traiter les méthodes avec paramètres, supposons que votre service possède la méthode ayant la signature suivante : public int calcule(int nb) ; L’invocation sera alors réalisée de la façon suivante : http://localhost:8080/axis/Carre.jws?method=calcule&nb=10 Vous obtiendrez la réponse suivante (toujours sous un format SOAP XML) dont voici un extrait : <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> - <calculeResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <calculeReturn xsi:type="xsd:int">100</calculeReturn> </calculeResponse> </soapenv:Body> </soapenv:Envelope> Exercices « Web Services Java » 4 Robert Voyer Déploiement des Services Web « Axis » Exercices illustrant le déploiement des Services Web sous Axis. Dans les précédents exercices, nous avons mis en œuvre un mode de déploiement entièrement pris en charge par « Axis ». Ce mode automatique de déploiement présente les contraintes suivantes : Nécessité de disposer des sources des classes dont on veut définir le ou les services. En effet, le mode de déploiement automatique d’Axis travaille sur le source des classes Java Impossibilité de décrire (en l’état actuel du système « Axis », mais cela pourrait évoluer par l’introduction de méta-données dans le source des classes) des particularités de déploiement. Ce sont pour ces raisons, que nous devons parfois réaliser un déploiement explicite. Cela implique la définition d’un fichier particulier, appelé descripteur de déploiement du service web. Ce fichier porte l’extension « wsdd » pour Web Service Deployment Descriptor. Exercice Deploiement1 : un premier déploiement simple Nous allons reprendre l’exercice « Service1 » qui retourne la chaîne de caractères « Hello World » et lui définir un descripteur de déploiement. Avant de commencer, créer un nouveau dossier de travail et placez-y la définition java de votre futur service, à savoir « HelloWorld.java ». Etape 1 : compilation de la classe du service La première étape consiste à compiler la classe que vous avez définie. Pour ce faire dans une fenêtre Dos ou Shell, vous tapez : javac HelloWorld.java. A l’issue de cette étape, vous devrez avoir dans votre dossier de travail, un nouveau fichier « HelloWorld.class ». Etape 2 : définition du descripteur de déploiement Le descripteur de déploiement doit être placé dans le même dossier que le « .class » définissant le service. Appelons ce descripteur « deploy.wsdd ». Son contenu sera minimalement celui-ci : <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="HelloService" style="RPC"> <parameter name="className" value="HelloWorld"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> Expliquons les différents éléments : Balise de début avec comme attributes les espaces de noms des balises mises en oeuvre dans un descripteur de deployment. <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> Le nom d’invocation du service, avec le mode, ici “RPC”. Ce sera le principal mode que nous mettrons en oeuvre. Exercices « Web Services Java » 5 Robert Voyer <service name="HelloService" style="RPC"> Ensuite, la classe compilée associée au service <parameter name="className" value="HelloWorld"/> Ensuite, les autorisations d’accès au service (ici toutes les méthodes) <parameter name="allowedMethods" value="*"/> Fin de la balise “service” </service> Fin de la balise “deployment” </deployment> Etape 3 : activation du déploiement Le descripteur de déploiement doit être maintenant pris en compte par le serveur « Axis » (i.e. le fournisseur de services) pour réaliser le déploiement du service. Pour ce faire, il convient d’utiliser l’utilitaire « AdminClient » du serveur « Acxis ». La ligne de commande est alors : java org.apache.axis.client.AdminClient deploy.wsdd Etape 4 : installation du service Nous avons, lors de l’étape précédente, demandé au serveur « Axis » d’être en mesure de traiter toutes les requêtes « SOAP » correspondant à notre service « HelloWorld ». Cela signifie donc qu’à la réception d’une requête « HTTP-SOAP », le serveur pourra appliquer la méthode spécifiée dans la requête à une instance de la classe correspondant à notre service (en lui passant, le cas échéant des valeurs). Cependant, pour que le serveur « Axis » soit en mesure d’utiliser la classe de notre service, il doit être en mesure d’y accéder. Techniquement, cela implique que la classe soit accessible par le chemin d’accès aux classes (classpath) du serveur « Axis ». Pour ce faire, vous devez copier votre classe compilée (HelloWorld.class) dans le dossier : <dossierAxis>\webapps\axis\WEB-INF\classes Vous êtes désormais en mesure d’accéder à votre service à l’URL suivante : http://localhost:8080/axis/services/HelloService Le nom « HelloService » correspond au nom du service que nous avons indiqué dans le descripteur de déploiement. Vous pouvez alors constater que votre service a bien été déployé sur « Axis » en ayant en retour la page « html » suivante : HelloService Hi there, this is an AXIS service! Perhaps there will be a form for invoking the service here... Etape 5 : exécution du service par son « alias » La dernière étape consiste à mettre en œuvre votre service qui est désormais accessible à travers tout le net ! Exercices « Web Services Java » 6 Robert Voyer Pour exécuter une méthode de votre service et obtenir la réponse « SOAP » correspondante, vous tapez l’expression suivante dans votre navigateur : http://localhost:8080/axis/services/HelloService?method=message Par rapport à l’expression précédente, vous précisez ici le nom de la méthode à exécuter, sous la forme de la valeur de l’attribut « method ». La réponse affichée est le contenu « SOAP », c’est-à-dire un fichier « XML » comme : <?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> - <messageResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <messageReturn xsi:type="xsd:string">Hello World</messageReturn> </messageResponse> </soapenv:Body> </soapenv:Envelope> Exercice Deploiement2 : un deuxième déploiement simple En vous basant sur le modèle de l’exercice précédent, on vous demande d’effectuer le déploiement du service « Service2 » qui retourne le carré d’un nombre passé en paramètre de méthode. Exercice Désactivation1 : pour désactiver un service web Pour retirer des services déployés, un service, il suffit d’appliquer que l’utilitaire « AdminClient », le fichier « undeploy.wsdd » correspondant au service. Le contenu du fichier « undeploy.wsdd » sera toujours le même, au nom de service près. Pour le service « HelloService », nous aurons : <undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="HelloService"/> </undeployment> Ensuite, la ligne de commande est simplement : java org.apache.axis.client.AdminClient undeploy.wsdd Essayez de désactiver les deux services que vous avez déployés dans les deux exercices précédents. Exercices « Web Services Java » 7 Robert Voyer Déploiement avancé des Services Web « Axis » Exercices illustrant le déploiement avancé des Services Web sous Axis. Exercice Deploiement3 : un service plus complet Etape 1 : définition et compilation de la classe du service On vous demande dans un premier temps de définir un service web de gestion de compte. Pour cela,, vous allez définir une classe «java « Compte.java », très simple qui ne contient qu’une seule variable d’instance « solde » représentant le contenu du compte, et qui propose les services suivants : public void depotDe(int montant) Permet d’effectuer un dépôt spécifique sur le compte. public void retraitDe(int montant) Permet d’effectuer un retrait spécifique sur le compte. On ne veut pas pouvoir effectuer le retrait si le solde devient négatif. public int valeurDuSolde() Retourne la valeur du solde du compte. Voici le squelette de la classe que vous devez compléter : public class Compte { // declaration de la variable solde // insérez votre code ici // le constructeur public Compte() { solde = 0; } public void depotDe(int montant) { // insérez votre code ici // actualisez le solde } public boolean retraitDe(int montant) { // insérez votre code ici // verifiez que le solde ne devient pas negatif // si c’est OK alors actualisez le solde et retournez true // si ce n’est pas OK alors retournez false } public boolean retraitAutorise(int montant) { // insérez votre code ici // retourne true si le solde ne deviant pas negative // retourne false si le solde ne deviant pas negative } } public int valeurDuSolde() { // insérez votre code ici } Exercices « Web Services Java » 8 Robert Voyer Etape 2 : définition du descripteur de déploiement Le descripteur de déploiement doit être placé dans le même dossier que le « .class » définissant le service. Appelons ce descripteur « deploy.wsdd ». Son contenu sera minimalement celui-ci : <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="CompteService" style="RPC"> <parameter name="className" value="Compte"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> Expliquons les différents éléments : Balise de début avec comme attributes les espaces de noms des balises mises en oeuvre dans un descripteur de deployment. <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> Le nom d’invocation du service, avec le mode, ici “RPC”. Ce sera le principal mode que nous mettrons en oeuvre. <service name="CompteService" style="RPC"> Ensuite, la classe compilée associée au service <parameter name="className" value="Compte"/> Ensuite, les autorisations d’accès au service (ici toutes les méthodes) <parameter name="allowedMethods" value="*"/> Fin de la balise “service” </service> Fin de la balise “deployment” </deployment> Etape 3 : activation du déploiement Le descripteur de déploiement doit être maintenant pris en compte par le serveur « Axis » (i.e. le fournisseur de services) pour réaliser le déploiement du service. Pour ce faire, il convient d’utiliser l’utilitaire « AdminClient » du serveur « Acxis ». La ligne de commande est alors : java org.apache.axis.client.AdminClient deploy.wsdd Etape 4 : installation du service Nous avons, lors de l’étape précédente, demandé au serveur « Axis » d’être en mesure de traiter toutes les requêtes « SOAP » correspondant à notre service « CompteService ». Cela signifie donc qu’à la réception d’une requête « HTTP-SOAP », le serveur pourra appliquer la méthode spécifiée dans la requête à une instance de la classe « Compte » correspondant à notre service « CompteService » (en lui passant, le cas échéant des valeurs). Cependant, pour que le serveur « Axis » soit en mesure d’utiliser la classe de notre service, il doit être en mesure d’y accéder. Techniquement, cela implique que la classe soit accessible par le chemin d’accès aux classes (classpath) du serveur « Axis ». Pour ce faire, vous devez copier votre classe compilée (Compte.class) dans le dossier : <dossierAxis>\webapps\axis\WEB-INF\classes Exercices « Web Services Java » 9 Robert Voyer Vous êtes désormais en mesure d’accéder à votre service à l’URL suivante : http://localhost:8080/axis/services/CompteService Le nom « CompteService » correspond au nom du service que nous avons indiqué dans le descripteur de déploiement. Vous pouvez alors constater que votre service a bien été déployé sur « Axis » en ayant en retour la page « html » suivante : CompteService Hi there, this is an AXIS service! Perhaps there will be a form for invoking the service here... Etape 5 : exécution du service par son « alias » La dernière étape consiste à mettre en œuvre votre service qui est désormais accessible à travers tout le net ! Pour exécuter une méthode de votre service et obtenir la réponse « SOAP » correspondante, vous tapez l’expression suivante dans votre navigateur : http://localhost:8080/axis/services/CompteService?method=valeurDuSolde Par rapport à l’expression précédente, vous précisez ici le nom de la méthode à exécuter, sous la forme de la valeur de l’attribut « method ». La réponse affichée est le contenu « SOAP », c’est-à-dire un fichier « XML » comme : <?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> <valeurDuSoldeResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <valeurDuSoldeReturn xsi:type="xsd:int">0</valeurDuSoldeReturn> </valeurDuSoldeResponse> </soapenv:Body> </soapenv:Envelope> Exercice DeploiementAvance1 : un service plus complet Etape 1 : restreint des accès client Lors de l’exercice précédent, en effectuant un déploiement qui autorise l’accès à toutes les méthodes du service, nous donnons une trop grande visibilité du service. En effet, la méthode « retraitAutorise » est une méthode interne de travail de notre service. Pour éviter d’accéder à cette méthode, nous avons les 2 possibilités suivantes : Déclarer la méthode « retraitAutorise » comme « private ». De cette façon, lors du déploiement, Axis en générant le document « WSDL », ne rend pas visible cerre méthode pour les clients du service. Cependant, cette façon de faire n’est pas toujours possible, car parfois, on veut rendre accessible une méthode pour d’autres objets (serveur en autres), sans pour autant qu’elle soit Exercices « Web Services Java » 10 Robert Voyer visible pour les clients. Si on converse la déclaration « private » de la méthode, elle ne sera pas utilisable par les autres objets serveur. Pour pallier cette difficulté, on peut conserver la méthode comme « public » (c’est information de développement reste inchangée), mais cacher l’accès aux client. Dans ce cas, on doit l’indiquer explicitement comme information de déploiement. Vous devez modifier le contenu du descripteur de déploiement de votre service, le fichier « deploy.wsdd », en précisant uniquement les méthodes accessibles aux clients. Le fichier devra renssembler à : <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="CompteService" style="RPC"> <parameter name="className" value="Compte"/> <parameter name="allowedMethods" value="valeurDuSolde depotDe retraitDe"/> </service> </deployment> On indique pour l’attribut « allowedMethods », uniquement les noms de méthodes accessibles à distance. Etape 2 : désactivation du service Pour retirer un service déployé, il suffit d’appliquer que l’utilitaire « AdminClient », le fichier « undeploy.wsdd » correspondant au service. Le contenu du fichier « undeploy.wsdd » sera toujours le même, au nom de service près. Pour le service « CompteService », nous aurons : <undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="CompteService"/> </undeployment> Ensuite, la ligne de commande est simplement : java org.apache.axis.client.AdminClient undeploy.wsdd Essayez de désactiver les deux services que vous avez déployés dans les deux exercices précédents. Etape 3 : activation du déploiement Le descripteur de déploiement doit être maintenant pris en compte par le serveur « Axis » (i.e. le fournisseur de services) pour réaliser le déploiement du service. Pour ce faire, il convient d’utiliser l’utilitaire « AdminClient » du serveur « Acxis ». La ligne de commande est alors : java org.apache.axis.client.AdminClient deploy.wsdd Etape 4 : exécution du service par son « alias » Maintenant, vous pouvez vérifier si la méthode interdite « retraitAutorise » est toujours accessible à distance ! Exercices « Web Services Java » 11 Robert Voyer Exercice DeploiementAvance2 : la perte des informations Etape 1 : modification du mode conversationnel L’exercice précédent met en évidence un problème de fonctionnement essentiel. En effet, si vous effectuez un dépôt (en passant par l’URL d’activation de la méthode du service, comme nous l’avons fait depuis le début) d’un montant quelconque et qu’ensuite vous demandez la visualisation du solde, vous obtiendrez toujours la même valeur : 0 ! Pourquoi ? La réponse est simple : à chaque fois que vous invoquez une méthode du service (en fait à chaque utilisation du service), le serveur « Axis », avant d’appliquer la méthode envoyée, crée une nouvelle instance de la classe correspondante (ici « Compte »). De ce fait, à chaque invocation de méthode, nous aurons toujours une nouvelle instance qui sera obtenue avec le constructeur par défaut qui initialise la variable « solde » à la valeur 0 ! // le constructeur public Compte() { solde = 0; } Détaillons ce qui ce passe avec les deux appels suivants : • http://localhost:8080/axis/services/CompteService?method=depotDe&montant=100 • http://localhost:8080/axis/services/CompteService?method=valeurDuSolde Le premier appel correspond à une demande de dépôt de 100 et le second correspondant à une demande de visualisation du solde. • Premier appel Le serveur crée une nouvelle instance C1 = new Compte() ; Il applique la méthode correspondant à l’appel C1.depotDe(100) ; A ce moment l’instance C1 dispose bien d’un solde de 100. Si on effectue, sur cette instance, l’appel suivant : C1.valeurDuSolde() ; Nous obtiendrons bien la valeur : 100 • Deuxième appel Le serveur crée une nouvelle instance Nous la nommons C2 pour bien montrer qu’elle est différente de C1 C2 = new Compte() ; C2 dispose alors d’un solde initial égal à 0. Le serveur « Axis » applique la méthode correspondant à l’appel C2.valeurDuSolde() ; Nous obtenons alors : 100 Pour éviter que le serveur ne crée une nouvelle instance à chaque appel, nous devons lui préciser que l’accès au service doit être associée à la session utilisateur. En d’autres termes, nous voulons que lors du premier accès, le serveur crée une nouvelle instance, puis lors des appels suivants, à partir du même navigateur (i.e. ce qui représente la notion de session), le serveur utilise toujours la même instance. Pour ce faire, vous devez inclure dans le descripteur de déploiement de votre service : <parameter name="scope" value="application"/> Exercices « Web Services Java » 12 Robert Voyer Vous devrez donc avoir quelque chose comme : <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="CompteService" style="RPC"> … // les autres elements habituels de déploiement <parameter name="scope" value=" application "/> </service> </deployment> Etape 2 : exécution de votre service Exécutez plusieurs fois les méthodes de dépôt et de retrait et visualisez à chaque fois votre solde pour constater que les différentes opérations s’appliquent bien au même objet serveur ! Exercice DeploiementAvance3 : la représentation complexe des informations Etape 1 : modification de la classe du service On vous demande de modifier la définition de la classe du service « CompteService » pour mémoriser dans une liste (un Vector Java), les différents montants des dépôts et des retraits. Vous devrez modifier votre classe et votre descripteur de déploiement pour accepter ces nouvelles caractéristiques. Voici les parties concernées dans votre classe : public class Compte { // declaration de la variable mouvements de type Vector // insérez votre code ici // le constructeur public Compte() { // initialiser votre variable mouvements // insérez votre code ici solde = 0; } public void depotDe(int montant) { // insérez votre code ici // actualisez la variable mouvements } public boolean retraitDe(int montant) { // insérez votre code ici // actualisez la variable mouvements dans le cas où le retrait est accepté } // insérez votre code ici // definition de la méthode “listeMouvements” } Etape 2 : prise en compte des modifications Pour que les modifications du service (changement de la classe, recompilatrion) soient correctement prises en compte, il faut : Effectuer un « undeploy » de la version actuellement déployée Exercices « Web Services Java » 13 Robert Voyer Effectuer un « deploy » de la nouvelle version Copier la définition « .class » de votre service dans le dossier réservé aux implémentations des services, c’est-à-dire : <dossierAxis>\webapps\axis\WEB-INF\classes Si vous continuez d’accéder à l’ancienne version de votre service, vous devez alors arrêtez le serveur « Tomcat », puis le redémarrer. Etape 3 : mise en oeuvre du service On vous demande d’appliquer diverses méthodes sur votre services, afin de valider vos définitions. A chaque fois, vous pouvez utiliser la méthode qui retourne la liste des mouvements afin de vérifier que vous mémorisez bien les différents montants de chaque dépôt et de chaque retrait. Exercices « Web Services Java » 14 Robert Voyer Interopérabilité des Services Web « Axis » Exercices illustrant la mise en œuvre des Services Web depuis le langage Java. Préliminaires Jusqu’à ce stade, nous avons toujours utilisé le navigateur Web pour invoquer les services et visualiser (sous le format SOAP) les résultats retournés. Nous allons étudier maintenant, un autre mode de communication avec les services plus adapté à leur mise en œuvre, et surtout à l’intégration avec d’autres applications. Ce deuxième modèle consiste à définir une application Java qui réalise les étapes suivantes : 1. Création d’un accès au service 2. Création d’un appel vers le service 3. Récupération de l’adresse URL du service accédé 4. Récupération de la méthode à appliquer 5. Mise en place des éventuels valeurs des paramètres de la méthode 6. Invocation du service 7. Récupération du résultat Le squelette standard et très général de définition d’un client d’accès à un service est : // importation des packages import org.apache.axis.client.*; import javax.xml.namespace.*; // definition de la classe public class ClientHelloWorld { // definition du “main” public static void main(String [] args) { try { // étape 1 : creation de l’accès vers le service Service service = new Service(); // étape 2 : creation d’un appel vers le service Call call = (Call)service.createCall(); // étape 3 : récupération de l’adresse URL du service accédé String endpoint = "http://localhost:8080/axis/services/HelloService"; call.setTargetEndpointAddress( new java.net.URL(endpoint)); // étapes 4-5-6-7 : Récupération de la méthode à appliquer Mise en place des éventuels valeurs des paramètres de la méthode Invocation du service Récupération du résultat String message = (String)call.invoke(“message”, new Object[]{}); } } System.out.println("Retour de Hello World " + message); } catch (Exception e) { System.err.println(e.toString()); } Exercices « Web Services Java » 15 Robert Voyer Exercice Client 1 : définition d’un client Java pour HelloWorld On vous demande, en reprenant directement le modèle précédent, d’écrire un client pour le service web, déjà déployé, « HelloWorldService ». Exercice Client 2 : définition d’un client Java pour Carre Ecrire un client Java qui utilise le service « CarreService ». Exercice Client 3 : définition d’un client Java pour Compte Ecrire un client Java qui utilise le service « CompteService ». On veut : • effectuer plusieurs dépôts ; • effectuer plusieurs retraits ; • visualiser le solde global ; • visualiser la liste des différents mouvements (i.e. les montants des dépôts et des retraits) Exercices « Web Services Java » 16 Robert Voyer Surveillance des Services Web « Axis » Puisque nous activons les services directement depuis des applications Java, nous ne visualisons plus le contenu des messages « SOAP » qui sont transités dans les échanges « http », et c’est bien pratique ainsi. Cependant, parfois, et même souvent pour les développeurs, il peut être utile d’examiner les messages « SOAP » qui sont échangés entre le client et le serveur. Pour cela, nous devons mettre en œuvre un moniteur qui aura en charge la visualisation des messages « SOAP ». Utilisation d’un moniteur de messages « SOAP » Pour pouvoir surveiller les messages SOAP échangés entre le client et le serveur, nous devons installer un moniteur spécifique. Lancement Pour cela, nous utilisons le moniteur intégré à « Axis » en exécutant : • java org.apache.axis.utils.tcpmon Paramétrage Ensuite, nous devons préciser : • Listen Port# Æ 9000 (par exemple) • Target Hostname Æ localhost (proposé par défaut) • Target Port# Æ 8080 (proposé par défaut) Fonctionnement Comment fonctionne le moniteur ? En fait, il intercepte toutes les requêtes et toutes les réponses « SOAP ». Pour cela, il écoute un numéro de port particulier (ici 9000) et il doit aiguiller vers le serveur de services grâce aux paramètres « Target Hostname » et « Target Port# ». Mise en oeuvre Pour que le moniteur puisse remplir son office, vous devez modifier l’URL d’accès à votre service en précisant, non plus le numéro de port actuel « 8080 », mais celui écouté par le moniteur, à savoir 9000 ! Ne pas oublier que c’est le moniteur qui redirige vers le serveurs de services web. Classiquement, notre client pour le service « HelloWorld » est défini comme suit : Exercices « Web Services Java » 17 Robert Voyer import org.apache.axis.client.*; import javax.xml.namespace.*; public class ClientHelloWorld { public static void main(String [] args) { try { Service service = new Service(); Call call = (Call)service.createCall(); String endpoint = "http://localhost:8080/axis/services/HelloService"; call.setTargetEndpointAddress( new java.net.URL(endpoint)); String message = (String)call.invoke(“message”, new Object[]{}); } } System.out.println("Retour de Hello World " + message); } catch (Exception e) { System.err.println(e.toString()); } Le seul changement concerne le numéro de port indiqué dans l’URL. Pour utiliser notre moniteur, nous changerons « 8080 » par « 9000 ». La modification sera simplement : String endpoint = "http://localhost:9000/axis/services/HelloService"; Exercice Moniteur1 : visualisation des échanges On vous demande de modifier vos différents clients, à savoir : • ClientHelloWorld • ClientCarre • ClientCompte pour visualiser dans la fenêtre du moniteur, les différents messages échangés. Exercices « Web Services Java » 18 Robert Voyer L’adaptation avec Java des Services Web « Axis » Préliminaires Exercices illustrant la mise en œuvre des Services Web depuis le langage Java en générant automatiquement la définition du proxy côté client. Cela sous-entend la création de toutes les interfaces et classes nécessaires à la mise en œuvre du service depuis Java. Cete fois-ci, plutôt que de mettre en œuvre un schéma générique comme précédemment, à savoir une référence du « endpoint », puis appel de méthode par « invoke » : String endpoint = "http://localhost:8080/axis/services/HelloService"; call.setTargetEndpointAddress( new java.net.URL(endpoint)); String message = (String)call.invoke(“message”, new Object[]{}); on peut utiliser le modèle classique, et plus performant, de Corba pour la définition des clients. Dans ce cas, on aura la mise en oeuvre de définitions Java qui correspondront directement à la définition du service utilisé., à savoir : • Utilisation du stub côté client et du skeleton côté serveur • Utilisation des Holders, lorsque les paramètres d’appel sont de type : o out ou inout • Utilisation des interfaces représentant les types des objets Java à manipuler Installation Il faut avoir dans le classpath (ce qui n’était pas le cas, jusqu’ici), le jar suivant : • <DossierAxis>/lib/wsdl4j.jar Utilisation du générateur « WSDL2Java » L’outil « Axis » qui permet la génération des définitions Java côté client et côté serveur, s’appelle « org.apache.axis.wsdl.WSDL2Java ». L’invocation depuis une fenêtre DOS, est la suivante : java org.apache.axis.wsdl.WSDL2Java (WSDL-file-URL) Prenons, par exemple, le fichier « wsdl » du service « CompteService » : java org.apache.axis.wsdl.WSDL2Java CompteService.wsdl Remarque : le fichier « CompteService.wsdl » peut-être créé simplement en sauvegardant le contenu de la fenêtre navigateur, lorsque l’on visualise la définition « wsdl » du service : http://localhost:8080/axis/services/CompteService?wsdl (avant la sauvegarde, affichez le source du contenu de la fenêtre) L’outil « WSDL2Java » génère l’ensemble des définitions dans un sous-dossier correspondant au nom « target namesspace » du descripteur « wsdl ». En effet, les namespaces sont mappés en packages Java. Exercices « Web Services Java » 19 Robert Voyer Génération côté client On l’effectue en tapant : java org.apache.axis.wsdl.WSDL2Java CompteService.wsdl Element WSDL Element Java généré Pour chaque type déclaré Une classe Java Une classe Holder si le type est utilisé comme paramètre out/inout Pour chaque type de port Une interface Java Pour chaque liaison Une classe Stub Pour chaque service Une interface Java Une classe d’implémentation (locator) Génération côté serveur On l’effectue en tapant : java org.apache.axis.wsdl.WSDL2Java –server-side –skeletonDeploy true CompteService.wsdl Element WSDL Element Java généré Pour chaque liaison Une classe Stub Une classe d’implémentation (locator) Pour chaque service Un descripteur « deploy.wsdd » Un descripteur « undeploy.wsdd » La génération côté serveur n’est pas indispensable, aussi nous ne la mettrons pas en œuvre dans les exercices qui suivent. Exercice AdaptationWSDL2Java1 : On vous demande de mettre en œuvre l’outil de génération Java, sur votre premier service web, à savoir « HelloService ». Pour ce premier exercice, nous allons vous donner le squelette de définition du client correspondant à ce nouveau modèle de mise en œuvre des services web. Etape 1 : création du fichier « wsdl » La première opération consiste à créer le descripteur « wsdl » de votre service web. Pour cela, vous devez prendre la définition obtenue depuis une fenêtre navigateur avec l’URL suivante : • http://localhost:8080/axis/services/HelloService?wsdl Ensuite, vous affichez le source que vous sauvegardez sous le nom « HelloService.wsdl » dans le même dossier que votre service web. Exercices « Web Services Java » 20 Robert Voyer Etape 2 : génération des classes du proxy Vous générez les classes utilitaires pour mettre en œuvre votre service depuis un client écrit en Java. Pour ce faire, et comme indiqué précédemment, vous évaluez depuis une fenêtre « DOS » (ou shell sous Unix) : • java org.apache.axis.wsdl.WSDL2Java HelloService.wsdl Comme indiqué, les packages Java sont obtenus en fonction des namespaces xml, ce qui devrait créer le package suivant : • localhost.axis.services.HelloService En d’autres termes, vos différentes classes et interfaces générées sont localisées dans le sousdossier suivant : • \localhost\axis\services\HelloService Etape 3 : définition du client Vous devez ensuite définir le client Java qui met en œuvre les classes générées lors de l’étape précédente. Pour cela, votre client ressemblera à ceci : package localhost.axis.services.HelloService; public class HelloServiceClient { public static void main(String [] args) throws Exception { // Création du service depuis le endpoint // HelloWorldService correspond au nom du service dans le fichier “wsdl” // c’est la balise : <wsdl:service name="HelloWorldService"> HelloWorldService service = new HelloWorldServiceLocator(); // Utilisation du service pour obtenir un stub qui implemente le SDI // (Service Definition Type ; i.e. PortType). // Pour le typage, c’est la balise : <wsdl:portType name="HelloWorld"> // Pour le getHelloService(), le HelloService correspond à la balise : // <wsdl:port binding="impl:HelloServiceSoapBinding" name="HelloService"> HelloWorld port = service.getHelloService(); } } // Mise en oeuvre du service par application directe des méthodes String texte = port.message(); System.out.println("Message obtenu : " + texte); Pour connaître les noms des classes et interfaces à utiliser, vous devez examiner le contenu du dossier contenant les classes et interfaces générées ainsi que le fichier « wsdl » ayant permis cette génération. Exercice AdaptationWSDL2Java2 : On vous demande de mettre en œuvre l’outil de génération Java, sur votre premier service web, à savoir « CarreService ». Exercice AdaptationWSDL2Java3 : On vous demande de mettre en œuvre l’outil de génération Java, sur votre premier service web, à savoir « CompteService ». Exercices « Web Services Java » 21 Robert Voyer Synthèse sur la mise en oeuvre des Services Web « Axis » On vous demande de mettre en œuvre les différentes phases que nous avons étudié tout au long des travaux dirigés. L’exercice consiste à définir un service web qui réalise la conversion « francs/euros » et « euros/francs ». Votre service web devra donc disposer des deux méthodes suivantes : • float getEuros(float montantEnFrancs) ; • float getFrancs(float montantEnEuros) : On prendra comme base de conversion : • 1 euro = 6.56 francs Voici la définition de la classe Java correspondante : public class ConvertisseurEF { public float getEuros(float montantEnFrancs) { return (float)(montantEnFrancs / 6.56); } } public float getFrancs(float montantEnEuros) { return (float)(montantEnEuros * 6.56); } Phase 1 : génération automatique Ecriture du fichier « .jws » correspondant Phase 2 : génération avec déploiement avec « .jws » Ecriture du fichier « .wsdd » correspondant Phase 3 : écriture d’un client générique Ecriture du client en utilisant le schéma générique d’accès au service web. On trouvera dans votre client quelque chose comme : String endpoint = "http://localhost:8080/axis/services/ConvertisseurService"; call.setTargetEndpointAddress( new java.net.URL(endpoint)); Float message = (Float)call.invoke(“getEuros”, new Object[]{new Float(100)}); Phase 4 : écriture d’un client spécifique par proxy Ecriture du client en utilisant le schéma par proxy d’accès au service web. Vous devrez donc générer les classes et interfaces nécessaires à partir du fichier « .wsdl » de votre service web. Exercices « Web Services Java » 22 Robert Voyer
Documents pareils
Déploiement et Invocation de services web Java avec Axis
service. En effet, le mode de déploiement automatique d’Axis travaille sur la source
des classes Java, Impossibilité de décrire des particularités de déploiement (classes
publiques et privées…). Po...
04-TD Web Service Java AXIS
Applications Réparties TD 4
Web Services en Java avec Axis
Expliquons les différents éléments :
Balise de début avec comme attributs les
espaces de noms des balises mises en œuvre ...
SERVLET TP 1 Installation du JDK Installation de Glassfish
Nous allons créer une première application Web qui utilise la technologie servlet. Les étapes consistent
à créer la servlet, à la compiler, puis à la déployer dans Glassfish.
L’organisation d’une a...