IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

Faire communiquer deux web services


Sujet :

Services Web Java

  1. #1
    Membre régulier Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Points : 83
    Points
    83
    Par défaut Faire communiquer deux web services
    Salut à tous.

    J'ai un petit problème en ce moment.
    Je suis sur un exemple classique de classe java qui gère un compte de banque.
    Donc opération de consultation du solde, dépôt et retrait.
    J'ai donc une classe java que j'ai déployé grâce à Axis (1.4) et Tomcat (6 je crois). J'arrive à faire mes opérations et même à garder "en mémoire" mon solde grâce à cette fabuleuse propriété "scope" dans le wsdd..

    Bref, pour pousser un peu l'exemple, et parce que je vais en avoir besoin dans mon projet, j'aimerai faire intervenir un autre web service.

    J'ai choisi de le faire intervenir au moment de l'opération de retrait puisqu'il faut une vérification comme quoi le solde est bien supérieur au montant à retirer demandé, avec renvoi de true ou false selon le cas.

    Et donc voilà le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    import org.apache.axis.client.*;
    import javax.xml.namespace.*;
    import javax.xml.rpc.ParameterMode;
     
    public class Compte {
     
    	int solde;
     
    	public Compte() {
    		solde=0;
    	}
     
    	public void depotDe(int montant) {
     
    		solde=solde+montant;
    	}
     
    	public void retraitDe(int montant) {
    	try{		
    		Service service= new Service ();
     
    		Call call = (Call)service.createCall();
    		String endpoint = "http://localhost:8080/axis/services/VerifService";
    		call.setTargetEndpointAddress( new java.net.URL(endpoint));
    		call.setOperationName(new QName(endpoint,"RetraitPossible"));
    		call.addParameter("n1", new QName("http://www.w3.org/2001/XMLSchema","int"), ParameterMode.IN);
    		call.addParameter("n2", new QName("http://www.w3.org/2001/XMLSchema","int"), ParameterMode.IN);
    		call.setReturnType(new QName("http://www.w3.org/2001/XMLSchema","boolean"));
    		Boolean retrait= (Boolean)call.invoke(new Object[]{solde,montant});
     
    		if (retrait==true)
    		{	
    			solde=solde-montant;
     
    		}
    	}catch (Exception e){ System.err.println(e.toString());}
    }
     
     
    	public int valeurDuSolde () {
    		return solde;
    	}
    }
    J'ai "incorporé" directement dans la méthode en question le code de création de service, d'appel, etc..

    Pour la vérification, j'ai donc créé une nouvelle classe (qui sera mon deuxième web service) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Verif {
     
    	public Verif () {}
     
    	public boolean RetraitPossible (int solde, int retrait) {
     
    		if (retrait > solde)
    			return false;
    		else
    			return true;
    	}
    }
    Maintenant, je vous donne le client, utilisé pour tester tout ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import org.apache.axis.client.*;
    import javax.xml.namespace.*;
    import javax.xml.rpc.ParameterMode;
     
    public class ClientCompte {
     
    	public static void main (String [] args) {
    		try{
     
    			Service service= new Service ();
     
    			Call call = (Call)service.createCall();
    			Call call2 = (Call)service.createCall();
    			Call call3 = (Call)service.createCall();
     
    			String endpoint = "http://localhost:8080/axis/services/CompteService";
    			call.setTargetEndpointAddress( new java.net.URL(endpoint));
    			call.setOperationName(new QName(endpoint,"depotDe"));
    			call.addParameter("n1", new QName("http://www.w3.org/2001/XMLSchema","int"), ParameterMode.IN);
    			call.setReturnType(new QName("http://www.w3.org/2001/XMLSchema","int"));			
     
    			Object ajout= call.invoke( new Object[]{100});
     
    			call3.setTargetEndpointAddress( new java.net.URL(endpoint));
    			call3.setOperationName(new QName(endpoint,"retraitDe"));
    			call3.addParameter("n2", new QName("http://www.w3.org/2001/XMLSchema","int"), ParameterMode.IN);
    			call3.setReturnType(new QName("http://www.w3.org/2001/XMLSchema","boolean"));			
     
    			Object retrait= call3.invoke( new Object[]{200});
     
    			call2.setTargetEndpointAddress( new java.net.URL(endpoint));
    			call2.setOperationName(new QName(endpoint,"valeurDuSolde"));
     
    			Object solde= call2.invoke( new Object[]{});
     
    			System.out.println("le solde est de "+ solde);
    		}catch (Exception e) {
    			System.err.println(e.toString());
    		}
    	}
    }
    En plus clair, il y a d'abord un dépôt de 100 qui est fait, suivi d'un retrait de 200 et on finit par un affichage du solde du compte. 3 méthodes utilisées donc.

    Figurez-vous que...ça fonctionne. ( ya eu bcp de temps de passé dessus...)

    Ma première question concerne le fait d'avoir incorporé directement dans la méthode retraitDe(int montant) de la classe Compte les commandes de création de service web, d'appel, etc. Est-ce que c'est la seule façon de faire? Est-ce que c'est propre?

    Ma seconde question concerne le fait de dupliquer les "Call call = (Call)service.createCall();" pour chaque appel d'une méthode du web service. C'est un peu violent.. N'y a-t-il pas un moyen plus propre de faire ça?

    Merci d'avoir lu tout ça et bonne soirée

  2. #2
    Membre régulier Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Points : 83
    Points
    83
    Par défaut
    Ca n'a pas l'air d'inspirer grand monde..

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2004
    Messages : 85
    Points : 89
    Points
    89
    Par défaut
    Bonjour,

    Je ne suis pas un spécialiste des web service, mais tu peut utiliser un outil qui se nome WSDL2Java. Cela te permet de générer des classes à partir de ton fichier wsdl et d'appeler celle-ci directement dans ton code.

  4. #4
    Membre régulier Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Points : 83
    Points
    83
    Par défaut
    Alors en fait ce que tu me proposes va me permettre de générer automatiquement les interfaces java clientes du web service. C'est vrai qu'après, dans le code du client, les appels sont moins nombreux mais à vrai dire, vu le temps qu'il nous reste dans le projet, je peux pas me permettre de changer de stratégie comme ça. Il faut que je reste sur le principe d'invocation "dynamique", sans génération automatique des interfaces..
    Donc en quelque sorte, ma question c'est : peut-on rendre plus propre ce code, sans modifier la stratégie?

Discussions similaires

  1. Faire communiquer un Web Service avec une autre application
    Par HobbitBleu dans le forum Services Web
    Réponses: 2
    Dernier message: 12/02/2013, 19h23
  2. Faire communiquer deux programmes python
    Par bestdomdom dans le forum Général Python
    Réponses: 5
    Dernier message: 26/10/2006, 09h30
  3. Faire communiquer deux applications
    Par thierrybatlle dans le forum Langage
    Réponses: 1
    Dernier message: 31/01/2006, 09h37
  4. comment faire communiquer deux form MDI?
    Par eponette dans le forum Langage
    Réponses: 3
    Dernier message: 17/08/2005, 12h20
  5. [Technologie][Stratégie] Faire communiquer deux applis
    Par KitsuneSama dans le forum Général Java
    Réponses: 13
    Dernier message: 21/06/2004, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo