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 :

Appeler un service web depuis mon application Java


Sujet :

Services Web Java

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 21
    Points
    21
    Par défaut Appeler un service web depuis mon application Java
    Bonjour,

    actuellement sur un projet, je dois faire appel à un service web chargé d'envoyer des mails selon les informations que je lui donne. Mon application est codée en Java (pas de jsp/servlet) et j'ai la structure xml à envoyer au service web à l'aide la méthode post. Le problème est que je ne suis complètement débutant en ce qui concerne les services web et je ne trouve pas mon bonheur pour répondre à cette question: "Comment faire appel à lui en Java et comment lui envoyer les données en POST?".

    Si quelqu'un pouvait me donner une piste je le remercie beaucoup que je sache dans quelle direction partir, il m'enlèverait une belle épine du pied. Je suis biensûr disposé à répondre à vos qestions si vous en avez.

    Lord Yu

  2. #2
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    Après quelques recherches et avoir parlé à quelques personne j'ai cru comprendre que je devais générer du code à partir du wsdl à ma disposition. J'intègre ensuite ce code à mon projet et je pourrais "facilement" utiliser mon web service. C'est en tout cas se que font les personnes m'en ayant parlé mais dans d'autres langages...

    J'ai donc fait des recherches dans ce sens pour Java et à priori je peux utiliser l'outils Axis2 prévu à cet effet. J'ai donc été sur Apache - Axis2, j'ai téléchargé le plugins eclipse permettant cette génération et lorsque je veux générer mon code (clique sur "Finish"), j'ai le message d'erreur suivant:
    "an error occurred while completing process java.lang.reflect.invocationtargetexception"

    Quelqu'un l'a déjà eu et peu m'éclairer?
    Merci

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    hello,

    voici un excellent tuto: http://www.netbeans.org/kb/docs/websvc/jax-ws.html

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Désolé Fleo0 mais même si ça m'a éclairci les idées sur certains points ce n'est pas vraiment se que je recherchais étant donné que je travaille sous éclipse et que le service web existe déjà, mais ça n'en était pas moins intéressant

    Donc j'y vois à présent un peu plus clair dans le service web et je pense pouvoir être plus précis dans mes questions.

    Donc il faut savoir que je fais ça dans le cadre d'un stage, le service web était déjà présent lors de mon arrivé, je doute qu'il ait été codé en Java/JSP et j'ai donc à ma disposition, en ligne, le MailServer.asmx?wsdl.

    J'ai donc essayé d'utiliser le plugin Axis2 for Eclipse pour générer une class java me permettant d'utiliser ce service mais j'avais une erreur, j'ai donc téléchargé l'outil Axis2 en stand alone et utilisé son outil wsdl2java pour générer le code client. Je vais maintenant l'intégrer à mon projet et essayer de l'utiliser.

    Suis-je sur la bonne voie pour utiliser le service web?

    Ai-je besoin de modifier quelque chose sur le serveur car j'ai vu qu'on peut générer du code serveur ("skeleton" je crois)? Je ne pense pas car le service est déjà utilisé mais pas par des applications Java.

    Merci de votre patience.

    Edit: En fait j'ai déjà un soucis pour l'intégrer à mon projet. J'ai donc mon projet dans éclipse et ma class java ici:
    C:\Documents and Settings\alexandre\Bureau\axis2-1.5-bin\axis2-1.5\Client\src\srcClient\MailServerStub.java

    Quand je l'ajoute à mon package .net par un simple glissé il ne connait pas les class de org.apache.axis2 et j'ai donc pas mal d'erreur. J'ai bien fait une tentative d'import du package mais sans succès, quelqu'un peut éclairer ma lanterne à ce sujet? Merci encore

    Edit2: J'ai réussi à importer les bons jar dans mon projet, il s'agissait de jar contenu dans le dossier lib de Axis2. Plus d'erreurs sur le projet donc, reste à trouver comment l'utiliser et quelles méthodes appeler dans cette class java quelque peu conséquente au niveau de la taille

  5. #5
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    Si tu dois "juste" appeler un service simple via soap/http, tu peux aussi le faire simplement de la façon suivante, sans framework :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    import java.net.*;
    import java.io.*;
     
    public class SendSoap {
    	public static void main(String[] args) throws Exception {
    		String soapMessage = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:oca=\"http://oca\">"
    				+ " <soap:Header/>"
    				+ "  <soap:Body>"
    				+ " <oca:sayHello>"
    				+ "  <name>Olivier</name>"
    				+ " </oca:sayHello>"
    				+ "</soap:Body>" + "</soap:Envelope>";
     
    		String res = sendSOAP("http://localhost:6060/axis2/services/Service1", soapMessage);
    		System.out.println(res);
    	}
     
    	public static String sendSOAP(String SOAPUrl, String soapMessage)
    			throws Exception {
    		URL url = new URL(SOAPUrl);
    		URLConnection connection = url.openConnection();
    		HttpURLConnection httpConn = (HttpURLConnection) connection;
     
     
    		byte[] byteArray = soapMessage.getBytes("UTF-8");
     
    		httpConn.setRequestProperty("Content-Length", String
    				.valueOf(byteArray.length));
    		httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
    		httpConn.setRequestProperty("SOAPAction", "");
    		httpConn.setRequestMethod("POST");
     
    		httpConn.setDoOutput(true);
    		httpConn.setDoInput(true);
     
    		OutputStream out = httpConn.getOutputStream();
    		out.write(byteArray);
    		out.close();
    		BufferedReader in = null;
    		StringBuffer resultMessage= new StringBuffer();
    		try {
    			InputStreamReader isr = new InputStreamReader(httpConn
    					.getInputStream());
    			in = new BufferedReader(isr);
    			String inputLine;
    			while ((inputLine = in.readLine()) != null) {
    				resultMessage.append(inputLine);
    			}
     
    		} finally {
    			if (in != null) {
    				in.close();
    			}
    		}
    		return resultMessage.toString();
    	}
    }
    Tu peux t'aider de soapUI ou d'eclipse pour générer la requête soap...

    A+

  6. #6
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    Cette solution m'a l'air cohérente et en plus de ça très facile à mettre en oeuvre... à première vu en tout cas.

    En effet je dois juste appeler un service via http en lui envoyant en paramètre la structure xml contenant le sujet du mail, le destinataire, l'expéditeur, le contenu du mail et sa priorité.

    Je n'ai pas trop bien compris pour ce qui est de générer une requête soap mais si j'ai bien compris c'est le fameux paramètre xml dont je parle plus haut (?).

    Donc j'ai remplacé le String soapMessage par ma structure xml de la forme suivante:
    <SendMail xmlns="http://nomDeDomaine.org">
    <mailToSend>
    <Address></Address>
    ...
    </mailToSend>
    </SendMail>
    Je ne sais pas comme je n'utilise pas vraiment soap si je dois laisser ça "httpConn.setRequestProperty("SOAPAction", "");" mais que je l'enlève ou non ne change rien.

    J'ai changé l'url de sendSoap par mon url qui est de la forme suivante (Je ne sais pas si une personne extérieure peut utiliser le service donc je ne met pas l'url entièrement):
    Au final je tombe sur une erreur 500:

    Exception in thread "main" java.io.IOException: Server returned HTTP response code: 500 for URL: http://www.nom_de_domaine.fr/MCCWebF...rver.asmx?wsdl
    at sun.net.http://www.protocol.http.HttpURLConn...Stream(Unknown Source)
    at org.apache.SendSoap.sendSOAP(SendSoap.java:50)
    at org.apache.SendSoap.main(SendSoap.java:21)
    J'ai pas l'impression de m'être trompé quelque part mais étant novice avec les service web et les requêtes http en java je préfère ne pas trop m'avancer.

    Merci beaucoup pour l'aide.

    Edit: si les accès au serveur sont restreins, peut être le firewall qui me bloque? Un moyen simple de le savoir?

  7. #7
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    On va y aller pas à pas...

    Est-ce que si tu tapes l'url de la wsdl (http://www.nom_de_domaine.fr/MCCWebF...rver.asmx?wsdl) dans un browser (IE ou Firefox par exemple), tu obtiens bien un contenu xml qui s'affiche ?

    Si non, on ne peut pas aller plus loin, il y a un problème de proxy ou de firewall ou un truc réseau / sécurité qui coince... si oui, on pourra passer à la suite...

    A+

  8. #8
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    Oui le contenu xml s'affiche bien quand je tape cette url

  9. #9
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    Cool,
    La prochaine étape est d'installer le logiciel soapUI. La version gratuite suffira amplement. Ce soft nous aidera à créer le message soap nécessaire à l'invocation du service.

    Tu peux télécharger soapUI ici : http://www.soapui.org/

    Une fois le soft installé, tu crées un projet (ctrl+n).
    Une boîte va apparaître où il faut donner un nom du projet et l'url de ta wsdl,
    ensuite tu cliques sur OK.

    Tu pourras ensuite accéder aux opérations disponibles par la wsdl.
    En faisant un double click sur l'opération désirée, soapUI va générer le message SOAP nécessaire à l'invocation.

    Il te suffira finallement de copier ce message dans le programme java, dans la variable String soapMessage ="..." (et de remplacer les ? par la valeurs dont tu as besoin)...

    N'hésite pas à me dire si tu es bloqué qq part.

    PS : tu peux laisser httpConn.setRequestProperty("SOAPAction", "");
    tel quel, cela n'a pas d'importance ici...
    A+

  10. #10
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    On avance, je vais finir par y arriver...

    Alors j'ai généré la requête soap qui est la suivante:
    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">
    <soap:Header/>
    <soap:Body>
    <tem:SendMail>
    <!--Optional:-->
    <tem:mailToSend>
    <!--Optional:-->
    <tem:FromAddress>mailauto1@test.com</tem:FromAddress>
    <!--Optional:-->
    <tem:FromName>test</tem:FromName>
    <!--Optional:-->
    <tem:ToAddress>alexandre@test.com</tem:ToAddress>
    <!--Optional:-->
    <tem:Subject>Mauvaise identification sur le serveur Openfire</tem:Subject>
    <!--Optional:-->
    <tem:Body>Un utilisateur tente de se connecter sans succès</tem:Body>
    <tem:MailBodyType>TEXT</tem:MailBodyType>
    <tem:MailImportance>HIGH</tem:MailImportance>
    </tem:mailToSend>
    </tem:SendMail>
    </soap:Body>
    </soap:Envelope>
    et j'ai vu que soapUI permettait de tester le service web donc j'ai fait le test pour ne pas me fatiguer pour rien si ça ne fonctionne pas, la réponse:
    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlnssi="http://www.w3.org/2001/XMLSchema-instance" xmlnssd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
    <SendMailResponse xmlns="http://tempuri.org/">
    <SendMailResult>SUCCESS</SendMailResult>
    </SendMailResponse>
    </soap:Body>
    </soap:Envelope>
    En prime j'ai bien reçu le mail sur mon adresse donc de ce coté là je crois que tout va bien.

    J'ai bien utilisé l'adresse suivante pour accéder à mon service dans soapUI:
    Donc suite à ça j'ai copié l'adresse utilisée dans mon script java, j'ai aussi copié la requête soap et là toujours la même erreur 500.

    Ça ce situerais à cet endroit là:
    InputStreamReader isr = new InputStreamReader(httpConn.getInputStream());

    et

    String res = sendMail("http://www.nom_de_domaine.fr/MCCWebFunctions/MailServer.asmx", mailMessage);
    Là je n'ai pas spécialement le temps mais je pense me faire un script php rapidement ce soir ou cet après-midi pour tester ce script java voir si l'envoi de la requête fonctionne bien ou si le problème est coté serveur (un bête insertion dans une base de donnée si la requête fonctionne correctement).

    Merci pour ton aide

  11. #11
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    String res = sendMail("http://www.opds.fr/MCCWebFunctions/MailServer.asmx", mailMessage);

    c'est le premier paramètre qui n'est pas le bon à mon avis
    "http://www.opds.fr/MCCWebFunctions/MailServer.asmx"

    l'url doit être celui du service. il est indiqué dans la wsdl dans un tag <service>

    Si tu as un doute et que tu peux poster ta wsdl, je te dirai lequel prendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
     
    <wsdl:service name="Service1">
     <wsdl:port name="Service1HttpSoap11Endpoint" binding="ns:Service1Soap11Binding">
      <soap:address location="http://localhost:6060/axis2/services/Service1.Service1HttpSoap11Endpoint/" /> 
      </wsdl:port>
    </wsdl:service>
    dans cet exemple, l'url du service (pas de la wsdl...) est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://localhost:6060/axis2/services/Service1.Service1HttpSoap11Endpoint
    A+

  12. #12
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    J'ai testé avec mon script php, ça fonctionnait parfaitement, j'ai donc retenté "au cas où" et j'ai oublié de décommenter la ligne suivante:
    httpConn.setRequestProperty("SOAPAction", "");
    Résultat: ça fonctionne.
    Quand je la remet ça ne fonctionne plus, le soucis venait donc de là.

    Merci beaucoup pour l'aide, tu m'as retiré une belle épine du pied.

    PS: te serait-il possible de supprimer le nom de domaine de tes quotes stp, j'ai oublié d'éditer celui-là ^^" Merci encore

  13. #13
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    Cool !

    c'est bizzare pour le SOAPaction, il devrait juste ajouter une info dans le header http... mais bon l'essentiel c'est que cela marche !

    [edit]ah... je crois que j'ai trouvé, c'est sûrement parce que c'est du soap 1.2...[/edit]

    A+

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/01/2015, 16h12
  2. Envoyer un sms depuis mon application java
    Par zpico dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 05/02/2014, 17h11
  3. Ouvrir une page Web depuis mon application
    Par Lelio1407 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 17/12/2009, 12h09
  4. Réponses: 6
    Dernier message: 21/07/2006, 02h19

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