Erreur au moment d'invocation d'un service web

Fermé
chercheur2017 Messages postés 57 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 - Modifié le 24 mai 2017 à 16:53
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 25 mai 2017 à 19:07
Bonjour à tous;

J'utilise le programme suivant (en Java) pour invoquer des services web.

package pgm2;
 
import java.net.*;
import java.io.*;
 
public class SendSoap {
 public static void main(String[] args) throws Exception {
  String soapMessage = "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope/\" xmlns:web=\"http://www.webservicex.net/\">"
    + " <soap:Header/>"
    + "  <soap:Body>"
    + " <web:GetGeoIP>"
    + "<!--Optional:-->"
    + "  <web:IPAddress>8.8.8.8</web:IPAddress>"
    + " </web:GetGeoIP>"
    + "</soap:Body>" + "</soap:Envelope>";
 
  String res = sendSOAP("http://www.webservicex.net/geoipservice.asmx", 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();
 }
}


Au moment de l'exécution (avec comme paramètres l'URL du service web "http://www.webservicex.net/geoipservice.asmx" ainsi que les valeurs attribuées à la variable "soapeMessage") j'obtiens le message d'erreur suivant:

 
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 500 for URL: http://www.webservicex.net/geoipservice.asmx
 at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
 at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
 at pgm2.SendSoap.sendSOAP(SendSoap.java:47)
 at pgm2.SendSoap.main(SendSoap.java:18)


Prière de me proposer vos solutions.

NB: Ce même programme fonctionne parfaitement avec d'autres services web (il suffit de changer l'URL et les valeurs attribuées à "soapMessage" évidemment).

Merci d'avance.
A voir également:

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 mai 2017 à 17:51
Bonjour,

L'erreur 500 c'est une erreur côté serveur donc toi en tant que client tu ne peux rien faire pour corriger le problème.

Éventuellement il y a peut être des informations supplémentaires concernant l'erreur, il faudrait lire la réponse complète, par exemple avec SoapUi
0
chercheur2017 Messages postés 57 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 4
24 mai 2017 à 18:37
Merci KX. tu confirmes ce que j'ai trouvé comme réponses après avoir effectuer une recherche. ça peut être à cause du crash du serveur ou quelque chose comme ça.

seulement, je n'ai pas compris concernant SoapUI (peut-on régler le problème avec SoapUI?). en fait, moi je l'ai utilisé pour tester les services (invocation des différentes méthodes du service) et j'ai même testé le service que j'ai cité (""http://www.webservicex.net/geoipservice.asmx") et ça marche très bien.

merci encore. bonne fin de journée!!
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 mai 2017 à 18:53
Imaginons que tu sois le développeur d'un serveur en Java, si le programme lève une exception qui n'est pas récupérée par un try/catch ça lèverai une erreur 500.
Évidemment il peut y avoir plein d'autres erreurs sur un serveur pour que ça provoque une erreur 500, mais parfois il y a un message d'explication de l'erreur qui dans certains cas peuvent aider à résoudre le problème (notamment si l'erreur 500 - par défaut - est en fait une erreur moins grave que ce qu'elle indique)
Pour l'instant tu as un programme Java qui voit l'erreur 500 et lèves une exception, s'il y a d'autres informations utiles dans la réponse d'erreur ton programme ne les affiches pas, mais SoapUi peut le faire facilement, c'est très pratique pour tester un webservice.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 24 mai 2017 à 19:34
Je viens de rentrer chez moi et j'ai testé ton web service avec SoapUI.
Voici la réponse complète qui m'est renvoyée :

HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 24 May 2017 17:18:55 GMT
Content-Length: 1109

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Header>
      <soap12:Upgrade xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
         <soap12:SupportedEnvelope qname="soap:Envelope"/>
         <soap12:SupportedEnvelope qname="soap12:Envelope"/>
      </soap12:Upgrade>
   </soap:Header>
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:VersionMismatch</faultcode>
         <faultstring>System.Web.Services.Protocols.SoapException: Possible SOAP version mismatch: Envelope namespace http://www.w3.org/2003/05/soap-envelope/ was unexpected. Expecting http://schemas.xmlsoap.org/soap/envelope/.
   at System.Web.Services.Protocols.SoapServerProtocol.CheckHelperVersion()
   at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()</faultstring>
         <detail/>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

Du coup ça rejoint ce que je disais tout à l'heure, c'est bien une exception qui a été levée sur le serveur (en .NET ici, pas en Java, mais c'est assez proche) et se traduit par une erreur 500.

La stack trace est relativement explicite: "Envelope namespace http://www.w3.org/2003/05/soap-envelope/ was unexpected. Expecting http://schemas.xmlsoap.org/soap/envelope/"

Le XML que tu lui donnes en entrée est incorrect.

Là encore SoapUI t'aide puisqu'il te construit automatiquement les requêtes valides à partir du WSDL. Ce qui donne :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.webservicex.net/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:GetGeoIP>
         <!--Optional:-->
         <web:IPAddress>8.8.8.8</web:IPAddress>
      </web:GetGeoIP>
   </soapenv:Body>
</soapenv:Envelope>

Le résultat est 200 OK avec SoapUI, à tester avec ton code :

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 24 May 2017 17:29:10 GMT
Content-Length: 391

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <GetGeoIPResponse xmlns="http://www.webservicex.net/">
         <GetGeoIPResult>
            <ReturnCode>1</ReturnCode>
            <IP>8.8.8.8</IP>
            <ReturnCodeDetails>Success</ReturnCodeDetails>
            <CountryName>United States</CountryName>
            <CountryCode>USA</CountryCode>
         </GetGeoIPResult>
      </GetGeoIPResponse>
   </soap:Body>
</soap:Envelope>

La confiance n'exclut pas le contrôle
0
chercheur2017 Messages postés 57 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 4
Modifié le 25 mai 2017 à 11:00
Bonjour KX,

Justement, j'ai utilisé SoapUI pour construire la requête "valide" (j'ai testé la méthode sur SoapUI, j'ai eu des résultats, j'ai copier la même requête avec les mêmes valeurs, je l'ai collé dans mon programme Java et ça ne marche pas). Chose que je n'arrive pas à comprendre est comment l'enveloppe s'est-elle transformée!!!!!!!!!!!!!!! parce qu'avec SoapUI normalement j'ai obtenu la bonne enveloppe :<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.webservicex.net/">

Bref, j'ai refait le test avec la bonne requête (que tu m'a envoyé et que j'ai obtenu moi même), et là j'obtiens l'erreur suivante avant l'exécution:

String soapMessage = "<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.webservicex.net/">"
    + " <soapenv:Header/>"
    + "  <soapenv:Body>"
    + " <web:GetGeoIP>"
    + "<!--Optional:-->"
    + "  <web:IPAddress>8.8.8.8</web:IPAddress>"
    + " </web:GetGeoIP>"
    + "</soapenv:Body>" 
    + "</soapenv:Envelope>";


La première partie de l'enveloppe ("<soapenv:Envelope xmlns:soapenv="http) + la balise du header (+ " <soapenv:Header/>") est soulignée en rouge avec un trait en zigzag . je me suis référer à un autre exemple qui marche pour essayé de résoudre le problème. Du coup, j'ai rajouté quelques antislash "\" dans l'enveloppe (normalement c'est pour bien définir la chaîne de caractère attendue dans la variable "soapMessage"). Le trait a disparu. mais au moment de l'exécution toujours rien: le même problème persiste.

Dernière question si tu permets: comment as-tu testé le service en question avec SoapUI. jusqu'à présent tout ce que je sais faire avec SoapUI est de créer un nouveau projet avec l'@ du WSDL et de tester les méthodes du service!!
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 25 mai 2017 à 11:24
Bonjour,

"comment as-tu testé le service en question avec SoapUI. jusqu'à présent tout ce que je sais faire avec SoapUI est de créer un nouveau projet avec l'@ du WSDL et de tester les méthodes du service"
Justement, c'est ce que j'ai fait aussi, le WSDL est ici :
http://www.webservicex.net/geoipservice.asmx?wsdl

Sinon, pour ta transformation en String, fait un System.out.println() de ce que tu construis et colle le dans SoapUI pour tester ce que ça donne dans le webservice (on ne peut pas exclure une erreur dans ton programme non plus...)
Normalement tu devrais avoir :

String ip = "8.8.8.8";
String request =
    "<soapenv:Envelope"
        + " xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\""
        + " xmlns:web=\"http://www.webservicex.net/\">"
        + "<soapenv:Header/>"
        + "<soapenv:Body>"
            + "<web:GetGeoIP>"
                + "<web:IPAddress>" + ip + "</web:IPAddress>"
            + "</web:GetGeoIP>"
        + "</soapenv:Body>"
    + "</soapenv:Envelope>";
System.out.println(request);

Je tiens quand même à insister sur le fait qu'en Java il existe déjà des standards pour faire de la manipulation de web service, on ne devrait donc pas avoir à faire ceci à la main...
0
chercheur2017 Messages postés 57 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 4 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
25 mai 2017 à 11:59
désolé, mais là je ne te suis pas du tout!!

concernant le test du web service, ce que je n'ai pas compris est comment tu as pu avoir ça?

HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 24 May 2017 17:18:55 GMT
Content-Length: 1109

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Header>
      <soap12:Upgrade xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
         <soap12:SupportedEnvelope qname="soap:Envelope"/>
         <soap12:SupportedEnvelope qname="soap12:Envelope"/>
      </soap12:Upgrade>
   </soap:Header>
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:VersionMismatch</faultcode>
         <faultstring>System.Web.Services.Protocols.SoapException: Possible SOAP version mismatch: Envelope namespace http://www.w3.org/2003/05/soap-envelope/ was unexpected. Expecting http://schemas.xmlsoap.org/soap/envelope/.
   at System.Web.Services.Protocols.SoapServerProtocol.CheckHelperVersion()
   at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()</faultstring>
         <detail/>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>



et concernat: "Sinon, pour ta transformation en String, fait un System.out.println() de ce que tu construis et colle le dans SoapUI pour tester ce que ça donne dans le webservice (on ne peut pas exclure une erreur dans ton programme non plus...)
Normalement tu devrais avoir :"


à quel niveau dois-je faire cette modification: est-ce au niveau de mon programme Java?

"colle le dans SoapUI"
et où dois-je le coller?

Pour Java, c'est vrai je ne maîtrise pas trop. vu que j'occupe un poste de chercheur je ne programme pas trop (notamment avec Java). normalement c'est aux ingénieurs de faire ce travail. mais comme on a un manque d'effectifs alors je voulais pas que le projet bloque. du coup, j'ai décidé de faire cette tâche moi même.

et je te remercie beaucoup pour ton aide KX. tu es toujours présent et tu réponds à toutes mes question. merci encore!!
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > chercheur2017 Messages postés 57 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018
25 mai 2017 à 12:23
"concernant le test du web service, ce que je n'ai pas compris est comment tu as pu avoir ça?"
J'ai repris dans ton code la requête que tu envoyais :
  String soapMessage = "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope/\" xmlns:web=\"http://www.webservicex.net/\">"
    + " <soap:Header/>"
    + "  <soap:Body>"
    + " <web:GetGeoIP>"
    + "<!--Optional:-->"
    + "  <web:IPAddress>8.8.8.8</web:IPAddress>"
    + " </web:GetGeoIP>"
    + "</soap:Body>" + "</soap:Envelope>";

Si on teste dans SoapUI on obtient bien l'erreur 500 mais avec le détail.

"à quel niveau dois-je faire cette modification: est-ce au niveau de mon programme Java? "
Oui, il s'agit de remplacer le String soapMessage ci-dessus mais avec le bon format de requête tel qu'attendu par SoapUi.

"je voulais pas que le projet bloque. du coup, j'ai décidé de faire cette tâche moi même"
Mais du coup ça ne sert pas à grand chose de faire ce genre de code à la main...
On peut faire quasiment tout en automatique en Java.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 25 mai 2017 à 12:50
Voici comment faire ton webservice en automatique en Java (avec Maven)

1) Petite configuration pour éviter un bug après, dans ton répertoire d'installation de Java il faut rajouter un fichier jaxp.properties

Exemple chez moi c'est :
C:\Program Files\Java\jdk1.8.0_60\jre\lib\jaxp.properties

Ce fichier texte doit contenir :
javax.xml.accessExternalSchema = all

Cela permet de désactiver une sécurité qui bloque par défaut l'accès au XML/XSD sur des sites distants. Voir JAXP 1.5 and New Properties

2) Tu créés un nouveau dossier avec un fichier pom.xml qui contient ceci :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>ccm.kx</groupId>
  <artifactId>geoip</artifactId>
  <version>1.0-SNAPSHOT</version>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxws-maven-plugin</artifactId>
        <version>2.4.1</version>
        <configuration>
          <wsdlUrls>
            <wsdlUrl>http://www.webservicex.net/geoipservice.asmx?wsdl</wsdlUrl>
          </wsdlUrls>
          <sourceDestDir>src/main/java</sourceDestDir>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

3) Dans ce nouveau dossier, en lignes de commandes tu fais :
mvn clean jaxws:wsimport

Cela devrait te générer plusieurs classes pour manipuler le service.

4) Tu ajoutes un code de test pour manipuler ce qui vient d'être généré.

package test;

import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.ws.Service;
import javax.xml.namespace.QName;

import net.webservicex.*;

@SuppressWarnings("restriction")
public class Test {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://www.webservicex.net/geoipservice.asmx?wsdl");
        QName qname = new QName("http://www.webservicex.net/", "GeoIPService");
        Service service = GeoIPService.create(url, qname);

        GeoIPServiceSoap geoipservice = service.getPort(GeoIPServiceSoap.class);
        GeoIP geoIp = geoipservice.getGeoIP("8.8.8.8");

        System.out.println(geoIp.getIP());
        System.out.println(geoIp.getCountryCode());
        System.out.println(geoIp.getCountryName());
    }
}

5) En exécutant le code du test tu devrais avoir :

8.8.8.8
USA
United States
La confiance n'exclut pas le contrôle
0
chercheur2017 Messages postés 57 Date d'inscription mardi 18 avril 2017 Statut Membre Dernière intervention 16 décembre 2018 4
25 mai 2017 à 18:10
Salut KX, je vais encore te déranger avec mes questions. j'essayait depuis tout à l'heure d'appliquer ce que tu m'a montré mais je n'arrive pas. tout ce que je sais sur maven c'est comment créer un projet, compiler et exécuter!! je l'ai appris sur le lien que tu m'a donné la dernière fois (https://forums.commentcamarche.net/forum/affich-37593827-debuter-avec-maven

alors mes questions sont les suivantes:

1- D'abord, où peut-ont obtenir le fichier "jaxp.properties"?

2- Comment générer le fichier pom.xml? En fait, quand je crée un nouveau projet avec la
commande "mvn archetype:generate -DgroupId=xxxx.yyy -DartifactId=testproject -
DinteractiveMode=false", j'obtiens un fichier pom.xml mais qui ne contient pas la partie
correspondante à la balise <build>. j'ai essayé de rajouter cette partie dans mon fichier
pom.xml, mais en tappant "mvn clean jaxws:wsimport" j'obtiens une erreur!!

3- Si par chance je pourrait régler tout ces problèmes, alors où dois-je rajouter le dernier
code qui me permet de tester et d'avoir des résultats?

bonne fin de journée :)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 25 mai 2017 à 19:15
"1- D'abord, où peut-ont obtenir le fichier "jaxp.properties"?"
Par défaut il n'existe pas, il faut créer un fichier texte vide avec ce nom là.
Il faut le mettre dans le répertoire "lib" du JDK (tu peux faire
mvn --version
pour connaître le dossier exact du Java home) et ajouter la ligne
javax.xml.accessExternalSchema = all

"2- Comment générer le fichier pom.xml?"
Dans ce cas précis je t'ai fait le fichier pom.xml complet, tu n'as plus qu'à le copier-coller dans un nouveau fichier. Tu n'as pas besoin d'archetype, c'est la commande jaxws:wsimport qui va générer les classes à partir du wsdl.

"où dois-je rajouter le dernier code"
Lorsque le code va être généré tu auras un dossier src/main/java avec dedans un package net/webservicex contenant les classes générées.
Mon code de test tu peux le mettre n'importe où, évidemment le mieux serait de le mettre dans un dossier "test" puisque j'ai mis que la classe Test était dans un "package test"

Remarque : tu peux bien sûr éditer ton code depuis Eclipse ou n'importe quel éditeur de code, Maven est supporté depuis plusieurs années.
0