Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Urgent SVP... Problème d'accents avec les Web Services

566 views
Skip to first unread message

JC

unread,
Jul 10, 2008, 5:08:09 AM7/10/08
to
Bonjour,

J’espère que quelqu’un m’apportera la solution car j'ai déjà perdu 6
jours de travail à chercher partout des solutions, et tous mes projets
sont bloqués à cause de ce problème ...

Je dois utiliser les services Web, mais j'ai un sérieux problème avec
les chaînes non ASCII (par exemple celles avec des accents, tel que
"Jérôme").

Voici deux morceaux de mon code : un extrait du WSDL, et des boutons
pour utiliser deux fonctions très simples du service Web.

- La première fonction (qui me sert de test pour l'envoi avec accent)
est Hello_Name (aName, aLogin, aPwd), qui utilise 3 chaînes de
caractères comme paramètres et renvoie simplement le paramètre
"aName" dans le message "Bonjour mon cher aName". Si j’envoie "John",
je reçois "Bonjour mon cher John", mais si j’envoie "Jérôme", je
reçois "Bonjour mon cher J?R?me" et pas "Bonjour mon cher Jérôme".
Quand je teste ce service web en Flash ou C#, je n'ai aucun problème
avec les accents, je reçois "Bonjour mon cher Jérôme".

- La deuxième fonction (qui me sert pour la réception d'accent) est
voir_users_meeting (aLogin), qui utilise 1 chaîne en paramètre ("1234"
en fait) et retourne tout simplement toujours la même liste de noms,
dont un nom avec accent ( "Zoé"). Encore une fois, avec Flash ou C#,
pas de problème, mais avec Windev je reçois "Zoé" et non pas "Zoé".

J'ai essayé beaucoup de solutions, mais je suppose 'pas la bonne'. Par
exemple, j'ai essayé:
- des appels avec SOAP.name [], SOAP.type []…
- l'importation du webservice comme une collection de procédures
(comme prévu par Windev), puis d'appeler ces procédures. C'est la
solution que j'utilise en ce moment.
- de transformer les chaines avant l'envoi (et/ou après) en (ou à
partir de) XML, Unicode, ANSI, OEM, URL, etc.
- d'utiliser des chaines fixes, des chaînes de caractères ASCIIZ, des
chaines UNICODE, etc., en tant que paramètres.

Rien ne me donne "Jérôme" ou "Zoé" :-(

J'ai vraiment besoin de votre aide. J'espère que quelqu'un a la
solution.

Cordialement
JC Tarby


//----------partie concernée du WSDL------------
<?xml version="1.0" encoding="utf-8" ?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="USTL_LIFL_TRIGONE" xmlns:s="http://www.w3.org/2001/
XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="USTL_LIFL_TRIGONE" xmlns:wsdl="http://
schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified"
targetNamespace="USTL_LIFL_TRIGONE">
<s:element name="Hello_Name">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="login" type="s:string" /
>
<s:element minOccurs="0" maxOccurs="1" name="pwd" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="Hello_NameResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Hello_NameResult"
type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
//..................
<s:element name="voir_users_meeting">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="id_meeting"
type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="voir_users_meetingResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="voir_users_meetingResult"
type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>


//------------- code Windev pour Hello_Name (code dans un bouton)

stResultat est STHello_NameResponse
stTexteAEnvoyer est chaîne
// j’ai essayé aussi: stTexteAEnvoyer est STHello_Name
//et aussi: stTexteAEnvoyer est chaîne UNICODE, etc....
//
//
// j’ai essayé: stTexteAEnvoyer:m_name="Jérôme"
// et aussi: stTexteAEnvoyer=AnsiVersUnicode("Jérôme")
stTexteAEnvoyer="Jérôme"
stResultat=Hello_Name(stTexteAEnvoyer, "my_login", "my_password")
// j’ai essayé: stRésultat=Hello_Name(stTexteAEnvoyer:m_name,
"mon_login", "mon_password")
Info(stResultat:m_Hello_NameResult)
// et aussi
stResultat:m_Hello_NameResult=XMLVersTexte(stResultat:m_Hello_NameResult)
Info(stResultat:m_Hello_NameResult)


//------------- code Windev pour voir_users_meeting (code dans un
bouton)
//c’est juste un exemple de tous mes essais…..
stResultat est STvoir_users_meetingResponse
sTexteAEnvoyer est chaîne
sTexteAEnvoyer="1234"
stResultat=voir_users_meeting(sTexteAEnvoyer)
stResultat:m_voir_users_meetingResult=XMLVersTexte(stResultat:m_voir_users_meetingResult)
Info(stResultat:m_voir_users_meetingResult)


//------fin du code

patrice

unread,
Jul 10, 2008, 5:23:07 AM7/10/08
to
Le soap utilise généralement l'utf8
UTF8VersChaîne("Zoé") = zoé

"JC" <jeanclau...@gmail.com> a écrit dans le message de
news:aa420fd5-4f7b-492b...@m73g2000hsh.googlegroups.com...

Romain PETIT

unread,
Jul 10, 2008, 5:26:42 AM7/10/08
to
JC avait prétendu :
> Bonjour,

Bonjour,

> //----------partie concernée du WSDL------------
> <?xml version="1.0" encoding="utf-8" ?>


A mon avis tu reçois de l'UTF-8...

--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)


JC

unread,
Jul 10, 2008, 6:04:12 AM7/10/08
to
- UTF8, OK, mais pour les envois vers le web service, comment faire ?
j'ai essayé de convertir avant, après, ne pas convertir, rien n'a
marché. Par exemple:

stRésultat est STHello_NameResponse
stRésultat=Hello_Name(ChaîneVersUTF8("Jérôme"),"monLogin", "monPwd")
Info(stRésultat:m_Hello_NameResult) //
résultat = J??r??me
Info(UTF8VersChaîne(stRésultat:m_Hello_NameResult)) // résultat =
J??r??me

A force de chercher, je ne vois plus rien... Qu'est-ce que je fais
mal ?


- pour le retour, en effet, ça marche. Je suis certain d'avoir essayé,
mais je n'ai pas du le faire sur les retours. J'ai du le faire que sur
les envois à force de tester dans tous les sens :-(
Ca donne ça comme code :
stRésultat=voir_users_meeting(sTexteAEnvoyer)
stRésultat:m_voir_users_meetingResult=UTF8VersChaîne(stRésultat:m_voir_users_meetingResult)

JC

patrice

unread,
Jul 10, 2008, 6:23:06 AM7/10/08
to
Remarque préliminaire: j'ai pas trop compris tes tests, mais on dirait que
tu envoi une valeur à un webservice et tu vérifie le retour
si ton envoi ET ton retour n'est pas fiable, tu risque la grosse prise de
tete.

1/ pour tester l'envoi au webservice: log dans un ficheir texte sur le
serveur
2/ pour tester la réception d'un webservice, fait envoyer au webservice une
valeur fixé (par exemple zoé)

ton but sera alors de chercher :
1/ quoi envoyer pour avoir zoé logger dans le txt
2/ quoi décoder pour obteneir zoé

AMHA, les seuls essais à faire coté envoi sont :
zoé, textevershtml(zoé), texteversutf8(zoé)
et communique nous les résultats


"JC" <jeanclau...@gmail.com> a écrit dans le message de

news:cb9a4e17-16ee-4c77...@y21g2000hsf.googlegroups.com...

JC

unread,
Jul 10, 2008, 7:16:31 AM7/10/08
to
On 10 juil, 12:23, "patrice" <patrice_labracherie_nos...@free.fr>
wrote:

> Remarque préliminaire: j'ai pas trop compris tes tests, mais on dirait que
> tu envoi une valeur à un webservice et tu vérifie le retour

en gros, c'est ca.


> 1/ pour tester l'envoi au webservice: log dans un ficheir texte sur le
> serveur

c'est déjà fait, et tous mes essais en Windev donnent des "?" à la
place des accents, alors que le même test en C# ou Flash donne bien
des accents corrects dans le log.

> 2/ pour tester la réception d'un webservice, fait envoyer au webservice une
> valeur fixé (par exemple zoé)

ça aussi, c'est la fonction voir_users.... ; elle renvoie toujours la
même chaine , et avec les réponses ci-dessus, je sais à présent
décoder les accents qui me sont renvoyés par le WS.


> AMHA, les seuls essais à faire coté envoi sont :
> zoé, textevershtml(zoé), texteversutf8(zoé)
> et communique nous les résultats

j'ai retesté avec tout ceci, et ça donne toujours des "?" côté serveur
(ou bien les caractères de codage UTF8, HTML, etc.) :-(
sTexteEnvoyé=TexteVersXML(ChaîneVersUTF8("Jérôme"))
//sTexteEnvoyé=TexteVersXML("Jérôme")
//sTexteEnvoyé=ChaîneVersUTF8("Jérôme")
//sTexteEnvoyé="Jérôme"
//sTexteEnvoyé=TexteVersHTML(ChaîneVersUTF8("Jérôme"))
//sTexteEnvoyé=TexteVersHTML("Jérôme")

Info(sTexteEnvoyé)

stRésultat=Hello_Name(sTexteEnvoyé,"LIFL_Tarby", "785581004191")

Une idée ???

JC

patrice

unread,
Jul 10, 2008, 8:29:20 AM7/10/08
to
Je comprend pas
textevershtml nik les accents
tu devrais avoir (au pire) pour zoé : zo&eacute;
t'est sur que t'as pas une conversion qq part ?

"JC" <jeanclau...@gmail.com> a écrit dans le message de

news:6d596627-4a28-482d...@x41g2000hsb.googlegroups.com...

JC

unread,
Jul 10, 2008, 9:14:28 AM7/10/08
to
A part le code du bouton et les procédures créées lors de l’import du
WS, il n’y a rien d’autre comme code. Je vous donne à la fin de ce
message les procédures associées au WS. Vous avez déjà le code du
bouton.
Voici en détails ce que ça donne pour les essais d’envois :
• Avec sTexteEnvoyé="Jérôme", j’envoie Jérôme et et au retour du WS je
reçois J?r?me
• Avec sTexteEnvoyé=ChaîneVersUTF8("Jérôme"), j’envoie Jérôme et je
reçois J??r??me
• Avec sTexteEnvoyé=TexteVersHTML("Jérôme"), j’envoie
J&eacute;r&#244;me et je reçois J&eacute;r&#244;me
• Avec sTexteEnvoyé=TexteVersHTML(ChaîneVersUTF8("Jérôme ")), j’envoie
J&#195;&#169;r&#195;&#180;me et je reçois
J&#195;&#169;r&#195;&#180;me
• Avec sTexteEnvoyé=TexteVersXML("Jérôme"), j’envoie Jérôme et je
reçois J?r?me
• Avec sTexteEnvoyé=TexteVersXML(ChaîneVersUTF8("Jérôme")), j’envoie
Jérôme, et je reçois J??r??me

Est-ce que je dois tester d’autres combinaisons ?


Voici le code de la procédure Hello_Name (générée par Windev à
l’import du WS)
PROCEDURE Hello_Name(name, login, pwd)


SOAP.Nom[1]="name"
SOAP.Type[1]=SOAPTypeChaîne
SOAP.Valeur[1]=name

SOAP.Nom[2]="login"
SOAP.Type[2]=SOAPTypeChaîne
SOAP.Valeur[2]=login

SOAP.Nom[3]="pwd"
SOAP.Type[3]=SOAPTypeChaîne
SOAP.Valeur[3]=pwd

bRes est un booléen
// j’ai masqué qqs infos dans la ligne ci-dessous (URL, paramètres…)
bRes=SOAPExécute("http://...", "Hello_Name", "…", "…")
SI PAS bRes ALORS
SI SOAPErreur(SOAPErrMessage)~="" ALORS
Erreur(ErreurInfo())
SINON
Erreur(SOAPErreur(SOAPErrMessage))
FIN
FIN

docres est une chaîne="docres"
res est un Service.STHello_NameResponse
XMLDocument(docres,SOAPDonneRésultat(SOAPRésultatXML))
SI PAS XMLExécuteXPath(docres,"//*/*[local-
name()='Hello_NameResponse']") ALORS
RENVOYER res
FIN
SI XMLTrouve(docres) ALORS

sidRes est une chaîne =XMLDonnée(docres,"href")
SI sidRes<>"" ALORS
sidRes=sidRes[[2 A ]]
XMLExécuteXPath(docres, "//*/*/*[@id='"+sidRes+"']")
FIN

Service._STHello_NameResponse_DepuisXML(res, docres);
FIN
RENVOYER res

FIN:
XMLTermine(docres)

Au cas où, je vous donne aussi les procédures privées générées par
Windev :

PROCEDURE PRIVÉE _STHello_Name_DepuisXML(param est un STHello_Name,
doc est une chaîne)
nPosInit est un entier=XMLSauvePosition(doc)
sPosition est une chaîne = XMLPosition(doc)
nPosBody est un entier=Position(sPosition, "Body")
SI nPosBody=0 ALORS
XMLRetourPosition(doc,nPosInit)
RETOUR
FIN
sID est une chaîne
SI XMLExécuteXPath(doc, sPosition+"/*[local-name()='name']") ALORS
sID = XMLDonnée(doc,"href")
SI sID<>"" ALORS
sID=sID[[2 A ]]
SI PAS XMLExécuteXPath(doc, "//*/*/*[@id='"+sID+"']") ALORS
XMLExécuteXPath(doc, sPosition+"/*[local-name()='name']")
FIN
FIN
param:m_name=XMLDonnée(doc)
FIN

SI XMLExécuteXPath(doc, sPosition+"/*[local-name()='login']") ALORS
sID = XMLDonnée(doc,"href")
SI sID<>"" ALORS
sID=sID[[2 A ]]
SI PAS XMLExécuteXPath(doc, "//*/*/*[@id='"+sID+"']") ALORS
XMLExécuteXPath(doc, sPosition+"/*[local-name()='login']")
FIN
FIN
param:m_login=XMLDonnée(doc)
FIN

SI XMLExécuteXPath(doc, sPosition+"/*[local-name()='pwd']") ALORS
sID = XMLDonnée(doc,"href")
SI sID<>"" ALORS
sID=sID[[2 A ]]
SI PAS XMLExécuteXPath(doc, "//*/*/*[@id='"+sID+"']") ALORS
XMLExécuteXPath(doc, sPosition+"/*[local-name()='pwd']")
FIN
FIN
param:m_pwd=XMLDonnée(doc)
FIN


XMLRetourPosition(doc, nPosInit)


PROCEDURE PRIVÉE _STHello_Name_VersXML(param, doc, nom, sID)
nPos est un entier

SI Taille(nom)>0 ALORS
XMLAjouteFils(doc,nom,"",Vrai)
XMLAjouteAttribut(doc,"xsi:type","lns:Hello_Name")
XMLAjouteAttribut(doc,"xmlns:lns","…")
SI Taille(sID)>0 ALORS
XMLAjouteAttribut(doc,"id","id" + sID)
FIN
FIN
XMLAjouteFils(doc,"name",param:m_name)
XMLAjouteFils(doc,"login",param:m_login)
XMLAjouteFils(doc,"pwd",param:m_pwd)

SI Taille(nom)>0 ALORS XMLParent(doc)


PROCEDURE PRIVÉE _STHello_NameResponse_DepuisXML(param est un
STHello_NameResponse, doc est une chaîne)
nPosInit est un entier=XMLSauvePosition(doc)
sPosition est une chaîne = XMLPosition(doc)
nPosBody est un entier=Position(sPosition, "Body")
SI nPosBody=0 ALORS
XMLRetourPosition(doc,nPosInit)
RETOUR
FIN
sID est une chaîne
SI XMLExécuteXPath(doc, sPosition+"/*[local-
name()='Hello_NameResult']") ALORS
sID = XMLDonnée(doc,"href")
SI sID<>"" ALORS
sID=sID[[2 A ]]
SI PAS XMLExécuteXPath(doc, "//*/*/*[@id='"+sID+"']") ALORS
XMLExécuteXPath(doc, sPosition+"/*[local-
name()='Hello_NameResult']")
FIN
FIN
param:m_Hello_NameResult=XMLDonnée(doc)
FIN


XMLRetourPosition(doc, nPosInit)


PROCEDURE PRIVÉE _STHello_NameResponse_VersXML(param, doc, nom, sID)
nPos est un entier

SI Taille(nom)>0 ALORS
XMLAjouteFils(doc,nom,"",Vrai)
XMLAjouteAttribut(doc,"xsi:type","lns:Hello_NameResponse")
XMLAjouteAttribut(doc,"xmlns:lns","…")
SI Taille(sID)>0 ALORS
XMLAjouteAttribut(doc,"id","id" + sID)
FIN
FIN
XMLAjouteFils(doc,"Hello_NameResult",param:m_Hello_NameResult)

SI Taille(nom)>0 ALORS XMLParent(doc)


Voilà, vous avez tout le code. Quelles sont vos propositions ?

JCT

patrice

unread,
Jul 10, 2008, 9:32:06 AM7/10/08
to
donc il suffirait d'encoder en utf8 à l'envoi et de décoder l'utf8 à la
réception ?

"JC" <jeanclau...@gmail.com> a écrit dans le message de

news:2c9c08bc-329b-4d79...@a1g2000hsb.googlegroups.com...

Romain PETIT

unread,
Jul 10, 2008, 9:45:35 AM7/10/08
to
patrice a présenté l'énoncé suivant :

> donc il suffirait d'encoder en utf8 à l'envoi et de décoder l'utf8 à la
> réception ?

J'allais le dire :-)

JC

unread,
Jul 10, 2008, 9:59:34 AM7/10/08
to
eh bien non, justement, j'ai essayé ça aussi depuis longtemps, voici
le code testé et le résultat. Ca ne fonctionne pas...

Code :
stRésultat est STHello_NameResponse
sTexteEnvoyé est une chaîne

sTexteEnvoyé=ChaîneVersUTF8("Jérôme")
// donc j'envoie Jérôme

stRésultat=Hello_Name(sTexteEnvoyé,"...", "...")
Info(UTF8VersChaîne(stRésultat:m_Hello_NameResult))


et le résultat est : J??r??me

Vous voyez, c'est pas simple ... Une autre idée ?

JCT

Romain PETIT

unread,
Jul 10, 2008, 10:04:11 AM7/10/08
to
JC avait soumis l'idée :

> Vous voyez, c'est pas simple ... Une autre idée ?

Quelle est le type de la variable stRésultat:m_Hello_NameResult ?
Ce doit être une chaine unicode...

JC

unread,
Jul 10, 2008, 11:13:56 AM7/10/08
to
> Quelle est le type de la variable stRésultat:m_Hello_NameResult ?
> Ce doit être une chaine unicode...

je ne sais pas, j'ai donné plus haut tout le code que j'ai, a priori
ce n'est pas Unicode. Comment savoir le type de cette variable ? Si
vous regardez le code plus haut, dans les procédures privées, les
lignes où elle apparait sont du genre de :
param:m_Hello_NameResult=XMLDonnée(doc)

du coup j'ai essayé ceci :


stRésultat est STHello_NameResponse
sTexteEnvoyé est une chaîne

sTexteReçu est une chaîne

sTexteEnvoyé=ChaîneVersUTF8("Jérôme")

stRésultat=Hello_Name(sTexteEnvoyé,"...", "...")

sTexteReçu=XMLVersTexte(stRésultat:m_Hello_NameResult)
Info(sTexteReçu)

sTexteReçu=UTF8VersChaîne(sTexteReçu)
Info(sTexteReçu)


et j'obtiens dans les deux Info: J??r??me

Que faire ? Pour info, si je déclare une variable chaine Unicode pour
stocker le résultat du WS, je me fais jeter : impossible de stocker
une structure...

JCT

Romain PETIT

unread,
Jul 10, 2008, 11:20:48 AM7/10/08
to
JC avait soumis l'idée :

> Que faire ? Pour info, si je déclare une variable chaine Unicode pour


> stocker le résultat du WS, je me fais jeter : impossible de stocker
> une structure...

Ta structure STHello_NameResponse, comment est-elle définie ?

patrice

unread,
Jul 10, 2008, 11:34:52 AM7/10/08
to
j'ai du mal à comprendre ton test :

>stRésultat=Hello_Name(sTexteEnvoyé,"...", "...")
>sTexteReçu=XMLVersTexte(stRésultat:m_Hello_NameResult)
>Info(sTexteReçu)

que recoit exactement le WS hello_name ?
qu'envoi t'il exactement ?


"JC" <jeanclau...@gmail.com> a écrit dans le message de

news:72a469c8-561d-4904...@w7g2000hsa.googlegroups.com...

patrice

unread,
Jul 10, 2008, 11:35:56 AM7/10/08
to
Sinon au pire
met un spy web pour vérifier le contenu des trame soap qui partent et
arrivent

perso j'utilise fiddler, marche tres bien pour le web, ca devrait assurer
pour le soap

"JC" <jeanclau...@gmail.com> a écrit dans le message de

news:72a469c8-561d-4904...@w7g2000hsa.googlegroups.com...

JC

unread,
Jul 10, 2008, 11:42:51 AM7/10/08
to
Pour complément, j’ai essayé le mode débogage Windev en pas à pas.
Voici ce que j’ai obtenu :

Lorsqu’on entre dans la procédure :


PROCEDURE PRIVÉE _STHello_NameResponse_DepuisXML(param est un

STHello_NameResponse, doc est une chaîne),

On constate que la ligne :
param:m_Hello_NameResult=XMLDonnée(doc)
correspond au retour du WS

Avant cette ligne param:m_Hello_NameResult vaut “”
et après cette ligne il vaut J??r??me

La trace faite côté serveur dit la même chose (la chaîne reçue est J??
r??me).
Donc c’est bien l’envoi par Windev (ou la façon dont Windev appelle le
WS) qui déconne. Mais pourquoi ? et quelle solution ?

Là, je sèche vraiment… Avec Flash, j’envoie une bête String, et je
reçois une bête String qui contient "Jérôme". On ne peut pas faire
plus simple... alors pourquoi Windev le sait pas le faire aussi
facilement ?

JCT


Olivier P.

unread,
Jul 10, 2008, 4:23:44 PM7/10/08
to
Salut,

je me mèle à la discussion par curiosité ;-)

En regardant bien le code de la fonction HelloName, je pense qu'il faut que
tu modifies :
SOAP.Valeur[1]=name
par
SOAP.ValeurEtendue[1]=name

cf. l'aide en ligne : SOAP.Valeur transfert une chaine ANSI (après
conversion pour de l'Unicode).
En utilisant ValeurEtendue à la place, aucune conversion n'est effectuée.

De plus, je te conseille d'utilisée de typer les variables passées à la
procédure.

STP, dis-nous ce que ça donne !

A+

Oliv


JC avait écris :

JC

unread,
Jul 10, 2008, 6:29:27 PM7/10/08
to
Bonsoir Olivier

> En regardant bien le code de la fonction HelloName, je pense qu'il faut que
> tu modifies :
> SOAP.Valeur[1]=name
> par
> SOAP.ValeurEtendue[1]=name

donc dans la fonction HelloName, j'ai remplacé :


SOAP.Nom[1]="name"
SOAP.Type[1]=SOAPTypeChaîne
SOAP.Valeur[1]=name

par:


SOAP.Nom[1]="name"
SOAP.Type[1]=SOAPTypeChaîne

SOAP.ValeurEtendue[1]=name

En testant, j'ai une erreur Windev lors de l'appel à HelloName sur la
ligne modifiée (ValeurEtendue) et qui dit :
Erreur à la ligne 6 du traitement Procédure globale Hello_Name.
Un élément de type chaîne ne peut pas être converti vers le type
variant.

:-( Dois-je changer d'autres choses encore pour que ce test puisse
fonctionner ?
JCT

Olivier P.

unread,
Jul 11, 2008, 3:29:55 AM7/11/08
to
Bonjour JC,

OK, il serait probablement bon de typer name en chaine Unicode ou en buffer pour faire ce test.

OU !

de laisser tel quel et de faire l'encodage à ce moment là. Ce qui donnerait :

SOAP.ValeurEtendue[1]= ChaineVersUTF8(name)

Bonne journée !

Oliv


JC

unread,
Jul 11, 2008, 5:31:21 AM7/11/08
to
Bonjour à tous

J'ai essayé aussi, avec plein de combinaisons possibles (chaine
unicode, buffer, conversion vers UTF8, valeur étendue, etc.), mais
toujours sans succès. Peut-être que je suis passé à côté... Si vous
voulez, vous pouvez tester par vous-mêmes le WS avec Windev. Pour
cela, envoyez-moi un mail (vous avez mon adresse dans mon profil), et
je vous donnerai l'URL du WSDL ainsi que login et mot de passe. Comme
ça, vous pourrez importer le WS comme je l'ai fait (en ensemble de
procédures). Je vous donne ci-dessous le code du bouton.

stRésultat est STHello_NameResponse
sTexteEnvoyé est une chaîne
sTexteReçu est une chaîne

sTexteEnvoyé="Jérôme"


stRésultat=Hello_Name(sTexteEnvoyé,"...", "...")

sTexteReçu=XMLVersTexte(stRésultat:m_Hello_NameResult)
Info(sTexteReçu)

sTexteReçu=UTF8VersChaîne(sTexteReçu)
Info(sTexteReçu)


JCT

JC

unread,
Jul 15, 2008, 7:10:01 PM7/15/08
to
N'ayant pas eu de réponse, et encore moins de solution à mon problème,
je me permets de relancer.

Qui voudrait tester le WS pour voir si mon pb d'accent a une
solution ? Manifestez-vous ici ou envoyez-moi un mail pour que je vous
donne l'URL du WSDL, et tout le reste...

Merci d'avance pour vos propositions.

JCT

news.free.fr

unread,
Jul 16, 2008, 5:19:32 PM7/16/08
to
bonjour,

ne me jeter pas de cailloux !

laisse ton appel de webservice en WD de coté, developpe un assembly en C#
qui fait le taf et tu utilises ton assembly dans WD.
Ca permettra de continuer tes dev et de revenir plus tard sur ce probleme
(dans quelques temps tu verras peut etre le probleme d'une autre facon, meme
si le provisoire a souvent tendance à durer...) ^^


"JC" <jeanclau...@gmail.com> a écrit dans le message de news:

b73d5b4d-b7ad-4858...@t54g2000hsg.googlegroups.com...

JC

unread,
Jul 24, 2008, 1:05:55 PM7/24/08
to
Bonjour à tous.

Grâce à Monsieur A. L. que je remercie encore une fois vivement,
l’explication (et la solution) à mon problème est la suivante : c’est
un bug Windev ! Voici le détail (un extrait de la réponse de A. L.)
pour ceux que ça intéresse :

Les entêtes HTTP qui sont envoyées par Windev sont :

POST /WS_1/Service.asmx HTTP/1.1
Content-Length: 475
Content-Type: text/xml
Accept: */*
Host: xxx.yyy.zzz.zzz
User-Agent: PC SOFT Framework
Connection: close
SOAPAction: "XXX/Hello_Name"

Remarquez que le "Contant-Type" est:
Content-Type: text/xml
alors qu'il devrait plutôt être:
Content-Type: text/xml; charset="utf-8"

Le fait de ne pas spécifier l'encodage "charset" est la source de tous
vos problèmes. Il faut contacter PCSoft. Je pense que c'est un bug
important.

Votre serveur (ayant le service SOAP) répond correctement avec:
Content-Type: text/xml; charset=utf-8

Donc votre réponse sera toujours bonne, alors que WinDev envoie
toujours des mauvaises requêtes.

Voici un exemple comme PREUVE de ce que j'avance. Nous allons faire
une requête manuelle au service SOAP en spécifiant l'encodage. Et nous
allons obtenir la bonne réponse.

1. Ajoutez un bouton dans votre projet de test.
2. Ajoutez le code suivant

[CODE]

sNom est une chaîne = "Jérôme"
sLogin est une chaîne = "xxx"
sPass est une chaîne = "yyy"
sReq est une chaîne = [
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/
envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body>
<Hello_Name xmlns="XXX" SOAP-ENV:encodingStyle="http://
schemas.xmlsoap.org/soap/encoding/">
<name xsi:type="xsd:string">%1</name>
<login xsi:type="xsd:string">%2</login>
<pwd xsi:type="xsd:string">%3</pwd>
</Hello_Name>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
]
sReq = ChaîneConstruit(sReq,sNom,sLogin,sPass)
sRésultat est une chaîne
docres est une chaîne = "docres"

// Exemple 1: Dans cet exemple je spécifie ISO-8859-1 comme caractère
(ce qui est exact). La réponse est bonne (en UTF-8)

SI HTTPRequête("http://xxx/WS_1/Service.asmx","PC SOFT
Framework","",sReq,"text/xml; charset=ISO-8859-1") ALORS
// affiche la réponse du serveur s'il y a un problème
// info(HTTPDonneRésultat(HTTPEntête))

// récupère la réponse et l'affiche (ça fonctionne, la réponse est
en utf-8)
sRésultat = HTTPDonneRésultat()
Info("Résultat avec encodage ISO-8859-1:"+RC+RC+sRésultat)

// affichage de la réponse
i est un entier = Position(sRésultat,"<Hello_NameResult>")+18
Info(UTF8VersChaîne(sRésultat[[i A Position(sRésultat,"<",i)-1]]))
FIN


// Exemple 2: Dans cet exemple je spécifie UTF-8 et fait la conversion
(ce que PCSoft devrait faire).

SI HTTPRequête("http://xxx/WS_1/Service.asmx","PC SOFT
Framework","",ChaîneVersUTF8(sReq),"text/xml;
charset=utf-8","guest","1234") ALORS
// affiche la réponse du serveur s'il y a un problème
// info(HTTPDonneRésultat(HTTPEntête))

// récupère la réponse et l'affiche (ça fonctionne, la réponse est
en utf-8)
sRésultat = HTTPDonneRésultat()
Info("Résultat avec encodage utf-8:"+RC+RC+sRésultat)

// affichage de la réponse
i = Position(sRésultat,"<Hello_NameResult>")+18
Info(UTF8VersChaîne(sRésultat[[i A Position(sRésultat,"<",i)-1]]))
FIN

[/CODE]

Vous remarquerez que les réponses sont bonnes.

Pour faire avancer votre projet, vous pouvez modifier les procédures
de vos requêtes pour envoyer manuellement les demandes SOAP et ensuite
passer la réponse au reste du code.

En espérant que ça pourra aider certaines personnes, et leur éviter de
perdre 10 jours de travail comme moi…

JCT

0 new messages