SOAP / Webservice

Signaler
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005
-
 AMINA140685 -
Bonjour, j'ai un problème avec l'utilisation d'un webservice. Le
webservice est écrit en dotNET, et je dois réaliser une application
java autour de ce webservice.



Le ws envoie toujours une réponse au format XML, inclus dans SOAP.

En important le fichier wsdl dans mon EDI java, toutes les méthodes importées sont de type SOAPElement, et non XML.



J'aurais aimé savoir comment extraire mon fichier xml de SOAP, pour que je puisse le traiter.

Voici un exemple de réponse SOAP que je dois traiter :



HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>

xml

</soap:Body>
</soap:Envelope>

en testant la fonction dans l'EDI, obtiens [ns:Error=null]

Merci
A voir également:

24 réponses

Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Salut



Ici pour moi ta réponse est vide ...

Avec quoi as-tu créé ton client WS (Eclipse/Axis ??) et avec quoi as-tu récupérer ta réponse SOAP ???



@+
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005

Je l'ai écrit avec NetBeans, en utilisant le client standard (J2EE 1.4 / JSR-109)
j'essaie d'installer Eclipse, mais il plante au démarrage, une histoire de classes non trouvées.
Donc je n'ai que NetBeans à ma disposition, et il n'intègre pas axis...
Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Salut



Ce ne serait pas la dernière version de Netbeans qui vient tout juste de sortir que tu as ???

Je n'ai pas mes docs de SOAP sur moi et je n'ai pas beaucoup de temps
aujopurd'hui pour me pencher sur les specs ... j'essayerais de trouver
une solution à ton problème ce WE si j'ai le temps (surement dimanche
soir).



Mais là tout de suite je n'ai pas de réponse à te fournir qui pourrait t'aider !!! ;-(



@+
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005

heu, ben Netbeans 4.1 EA2, c'est la seule qui possède les fonctions J2EE, je crois.

J'avoue que ça m'aiderais bien, car ça fait une semaine que je planche, et je n'arrive jamais à rien.

Merci
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005

Bonsoir, j'aurais aimé savoir si tu as su trouver quelque chôse pour mon problème
J'ai encore passé mon week-end à chercher, et je n'aboutis à rien.
Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Salut



Je regarde ce soir, j'ai carrément oublié de faire ça hier !!! ;-(



@+
Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Salut



Y a rien qui me choque dans ton message SOAP, les namespaces sont
corrects, la syntaxe également ... on ne peut pas faire plus simple
comme message SOAP !!!
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>

xml

</soap:Body>
</soap:Envelope>

Peut-être
que cela vient de ton programme ou autre, je ne sais pas exactement ce
que tu fais pour le générer ou l'extraire .... tu peux me fournir
d'autres infos ???



@+
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005

En fait, je veux pouvoir traiter le XML de réponse. Je prend un exemple.
le webservice effectue un "login". J'envoie au webservice mon login, mon password crypté md5, et la durée de ma session.
En réponse, il m'envoie un XML.
Dans ce XML, il y a deux types d'infos. Si la requête à réussi, le WebService renvoie un "long", qui est un identifiant de session.
<?xml version="1.0"?>
<long Value=x/>
Dans ce cas-ci, je voudrais récupérer la valeur de "long".

Maintenant, si la requête échoue, je reçois un XML de ce type :

<?xml version="1.0"?>
<Error>
<Message>Message d'erreur</Message>
<StackTrace>...</StackTrace>
...

</Error>

Dans ce cas, je souhaite affiche le message d'erreur.

Point de vue programmation : (extrait de ma procédure)
try {
SOAPElement soap = getUsers().getUsersSoap.().auth(login, pass, time) //extrait de Netbeans, fonction générée automatiquement
String ns = soap.getNameSpaceURI(); //renvoie http://xxx.xxxxxxxx.xx (OK)
String ln = soap.getLocalName(); //renvoie AuthResp (OK)
Iterator it = soap.getChildElements();
do{
Element el = (Element)it.next(); //cast d'un node vers un element.
String childName = el.getLocalName(); //renvoie "Long" ou "Error", selon le type de message.
String childParam = el.getValue(); //renvoie NULL
}
while (it.hasNext());

Dans les 2 cas, ça ne va pas plus loin. Donc, impossible d'aller chercher la valeur du "long", ou d'afficher le message d'erreur...
J'ai fais des tests comme el.hasAttributes(), et el.hasChildNodes(), et ils me renvoient tous les deux FALSE, or que visiblement, ce n'est pas vrai ! (un attribut pour "long", et au moins un child pour "error").

Comprends pas. J'ai essayé avec tout ce qui renvoyait un String, et le résultat est toujours le même...

Niveau génération du XML, je ne saurais pas t'aider, c'est écrit en dotNET, et je n'y ai pas accès.
Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Salut



Aussi dans ton WSDL as-tu bien mis <soap-binding ...
style="document"> et <soap:body use="literal"> ??? Parce que
sinon ton SOAP peut-être interprété comme un RPC ou alors il cherche un
format d'encodage ....



Pour ce qui est de l'erreur utilise plutot le SOAP-Env:Fault qui est
dans le body du SOAP et qui te renvoit une erreur si il s'en passe une
...




Franchement si tu veux faire du web service, utilise Axis ce sera beaucoup plus facile et également beaucoup plus rapide ...
Regarde
mon tutorial vidéo à ce propos ... dis moi ce que tu en penses (si tu
ne t'es jamais servi de Axis cela risque de te surprendre ... Web
Services en 2 minutes tu veux essayer !). ;-)




@+
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005

Merci, je vais regarder. Du moment que ça marche sous NetBeans, ça me va, vu que le reste de l'application est déjà écrite.

C'est mon maître de stage qui a écrit le WebService, et il ne connait pas bien SOAP (comme moi, d'ailleurs ).Donc l'utilisation de SOAP-Env:Fault est à proscrire, bien que je lui ai déjà demandé de modifier un peu son appel WebService (tous ses appels se font via http et invoke...)
Le WSDL dont tu parles, c'est celui généré par le WebService ? ça servira p'têt à rien si je ne change que la copie locale du fichier...
( au risque d'être n00b : c'est lequel ton tuto que tu me conseille ?)

En tous cas, merci de ton aide. Je te tiendrai au courant
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005

edit : j'ai regardé le wsdl, , il est en style document, et le body est use:litteral. De plus, mon rôle n'est pas de faire un webservice, mais de faire un client léger, utilisant un WS existant. C'est pour ça que je ne sais pas si Axis me sera utile
Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Salut



AXIS devrait pouvoir t'aider ... un simple WSDL2Java
te génère le client à partir du WSDL. C'est super simple pour s'en
servir et cela fait l'objet de mon prochain tutorial video que je vais
faire cette semaine ou la semaine prochaine ...

Pour mon tutorial vidéo clic sur l'onglet video (au milieu de la page)
de la page d'accueil de javafr.com pour faire apparaître l'ensemble des
vidéos et ce doit être une des dernière J2EE ...



Les APIs d'Axis devraient aussi beaucoup t'aider, beaucoup de choses sont cachés et simplifiées au maximum.



Voici le lien vers la page du guide utilisateur :

http://ws.apache.org/axis/java/user-guide.html



Lien vers tutorial:

(Tut super court et simple comme Axis !) :

http://www-users.itlabs.umn.edu/classes/Fall-2003/csci5131/www_files/labs/lab4/wsdl2java_tutorial.html

(IBM) :

http://publib.boulder.ibm.com/infocenter/ws51help/index.jsp?topic=/com.ibm.websphere.exp.doc/info/exp/ae/rwbs_wsdl2java.html



Avec ça je pense que le client pour ton webservice sera bien fait, si
cela ne marche pas correctement c'est le endpoint (qu'à fait ton
tuteur) qui ne doit pas bien marcher ... ;-) Ou alors le WSDL qui est
pourri (si c'est un humain comme ton tuteur qui l'a fait ce ne serait
pas étonnant) !!!



@+
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005

J'ai vu ton tuto, il est super bien fait ! Pas de chances pour moi, c'est le côté client qu'il me faut. A ce propos : (**enfile sa tenue de n00b de combat**)
j'ai téléchargé axis, installé dans tomcat, ...
Si je dois créer un client, je dois utiliser WSDL2Java
J'ai vu la commande java org.apache.axis.wsdl.WSDL2Java ...
seulement, ce truc-là est dans le jar axis.jar, et ça m'envoie des exceptions. Tu saurais me dire la syntaxe exacte pour utiliser ce truc-là ? (j'en ai vu des différentes, je sais pas laquelle est correcte)
Ensuite, avec les fichiers générés, je crée mon client en utilisant les classes comme des classes locales ?

Merci pour tes réponses !
Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Salut



De la façon dont le fait la personne dans le tutorial (le 1er) pour moi ça marche ... je vais vérifier ça tout de suite ... ;-)



@+
Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Salut



Je confirme cela marche très bien !!!! Surement que tu as un problème de classpath ...



Décompresse le répertoire complet lib du
zip de Axis (en laissant les .jar dans le répertoire lib) à la racine
de ton répertoire de travail : en gros tu dois te rettrouver avec un
répertoire zip auquel tu rajoutes ton WSDL. Ensuite exécute le BAT
suivant :

Set
CLASSPATH=lib/axis.jar;lib/commons-logging.jar;lib/commons-discovery.jar;lib/jaxrpc.jar;lib/wsdl4j.jar;lib/saaj.jar;lib/axis-ant.jar

java -classpath %CLASSPATH% org.apache.axis.wsdl.WSDL2Java --verbose HelloLangendpointPort.wsdl



Change le nom de ton WSDL évidemment et cela doit te générer très
rapidement ton client ... je viens de le faire en live et aps de
problème avec n'importe quel web service .... ;-)




@+
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005

Je dois aller voir un exorciste, c'est pas possible...
J'ai fait EXACTEMENT ce que tu as dis !

C:\Documents and Settings\Big>java -cp %AXIS% org.apache.axis.wsdl.WSDL2Java --v
erbose "WebService1.wsdl"
Exception in thread "main" java.lang.NoClassDefFoundError: javax.wsdl.Definition


at org.apache.axis.wsdl.toJava.JavaGeneratorFactory.class$(JavaGenerator
Factory.java:71)
at org.apache.axis.wsdl.toJava.JavaGeneratorFactory.addDefinitionGenerat
ors(JavaGeneratorFactory.java:182)
at org.apache.axis.wsdl.toJava.JavaGeneratorFactory.addGenerators(JavaGe
neratorFactory.java:136)
at org.apache.axis.wsdl.toJava.JavaGeneratorFactory.(JavaGenerator
Factory.java:114)
at org.apache.axis.wsdl.toJava.Emitter.(Emitter.java:142)
at org.apache.axis.wsdl.WSDL2Java.createParser(WSDL2Java.java:202)
at org.apache.axis.wsdl.gen.WSDL2.(WSDL2.java:96)
at org.apache.axis.wsdl.WSDL2Java.(WSDL2Java.java:187)
at org.apache.axis.wsdl.WSDL2Java.main(WSDL2Java.java:356)

Quand je dis que ça marche pas
J'ai téléchargé la dernière version d'axis, pourtant
Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Salut




Ton
problème c'est cette exception : NoClassDefFoundError, ce qui
signifie que Axis n'arrive pas à trouver une classe qui est dans un
JAR. LA seule solution c'est de vérifier que tu as bien tous les JAR
dans ton classpath. Pour moi il n'y a pas d'autres erreurs que le
classpath, l'exception est suffisamment explicite !



En fait j'ai rajouté les JAR un par un et je me rappel avoir eu
justement cette erreur (j'étais presque sur que tu allais avoir un
problème de classpath !). Il me semble que c'est le JAR wsdl4j.jar qui
doit te manquer dans ton classpath ... sinon ça marche. Je l'ai fait en
partant de rien tout à l'heure et en téléchargeant la dernière version
de Axis et en faisant mon batch à la main ... y a pas de raison pour
que cela ne marche pas !



Tu dois avoir 8 Jars dans ton classpath et un fichier de config log4j.properties




Vérifie bien le classpath dans ton bat, il doit y avoir une toute petite faute que tu n'as pas du voir ... ;-)



@+
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005

Neodante, merci pour tes conseils. J'ai réussi à lancer Eclipse, avec un plugin axis intégré. Tout est généré.
En effet, ça n'a pas l'air compliqué, mais il y a encore un truc qui m'embête...
Axis m'a généré la fonction suivante :

private _AuthResp_AuthRslt authentification(String login, String pass, long time){
...
}

quelque chôse comme ça, du moins
Le problème, c'est que ça revient au même ! Mon XML est maintenant encapsulé dans cette classe, et je voudrais bien le récupérer.

N'y connaisant rien... Je dirais que je dois utiliser la fonction DeserializeBean(...), mais il me faut des paramètres (QName ?) que je ne connais pas. Et je suis pas sûr que ça me renvoie un XML à parser avec SAX ou DOM
Saurais-tu encore éclairer ma lanterne, stp ?
Merci
Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
Salut



Voici le lien vers la documentation de WSDL2Java :

http://ws.apache.org/axis/java/user-guide.html#WSDL2JavaBuildingStubsSkeletonsAndDataTypesFromWSDL



Egalement, je t'ai trouvé un lien qui devrait te débloquer dans ce que tu fais :

http://users.skynet.be/pascalbotte/rcx-ws-doc/seiclient.htm



Cela vaut mieux qu'un post de 10 pages !! ;-)



@+
Messages postés
23
Date d'inscription
jeudi 29 mai 2003
Statut
Membre
Dernière intervention
22 mars 2005

Merci, mais ça ne répond pas à ma question De plus, j'avais déjà lu plusieurs fois ces pages.
J'ai du mal m'exprimer. Le client généré par axis est fonctionnel. Sur les liens fournis, ils font un client qui renvoie des types complexes. Ca marche aussi sans problèmes.
Un collègue m'a écrit un webservice dotNET pour tester.
se service contient :
- une méthode HelloWorld() qui renvoie un string [le client le gère impec]
- une méthode Add(int a, int b) qui renvoie un int [client OK]
- une méthode Personne(String nom, String prenom, int Age) qui renvoie une classe de type personne [client OK, vu que axis a créé une classe personne]
-une méthde Hello() qui renvoie un bête xml <hello String="Hello World"/>, et la, le client ne récupère pas de XML.

Axis a généré une classe _HelloResponse_HelloResult, avec des méthodes que je ne connais pas, mais aucunes d'entres elles ne me renvoie un document XML.
Je sais pas si c'est plus clair . Au pire, je poste la classe qui pose problème.

Merci, en tous cas