Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

23 réponses
Avatar
JC
Bonjour,

J=92esp=E8re que quelqu=92un m=92apportera la solution car j'ai d=E9j=E0 pe=
rdu 6
jours de travail =E0 chercher partout des solutions, et tous mes projets
sont bloqu=E9s =E0 cause de ce probl=E8me ...

Je dois utiliser les services Web, mais j'ai un s=E9rieux probl=E8me avec
les cha=EEnes non ASCII (par exemple celles avec des accents, tel que
"J=E9r=F4me").

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

- La premi=E8re fonction (qui me sert de test pour l'envoi avec accent)
est Hello_Name (aName, aLogin, aPwd), qui utilise 3 cha=EEnes de
caract=E8res comme param=E8tres et renvoie simplement le param=E8tre
"aName" dans le message "Bonjour mon cher aName". Si j=92envoie "John",
je re=E7ois "Bonjour mon cher John", mais si j=92envoie "J=E9r=F4me", je
re=E7ois "Bonjour mon cher J?R?me" et pas "Bonjour mon cher J=E9r=F4me".
Quand je teste ce service web en Flash ou C#, je n'ai aucun probl=E8me
avec les accents, je re=E7ois "Bonjour mon cher J=E9r=F4me".

- La deuxi=E8me fonction (qui me sert pour la r=E9ception d'accent) est
voir_users_meeting (aLogin), qui utilise 1 cha=EEne en param=E8tre ("1234"
en fait) et retourne tout simplement toujours la m=EAme liste de noms,
dont un nom avec accent ( "Zo=E9"). Encore une fois, avec Flash ou C#,
pas de probl=E8me, mais avec Windev je re=E7ois "Zo=C3=A9" et non pas "Zo=
=E9".

J'ai essay=E9 beaucoup de solutions, mais je suppose 'pas la bonne'. Par
exemple, j'ai essay=E9:
- des appels avec SOAP.name [], SOAP.type []=85
- l'importation du webservice comme une collection de proc=E9dures
(comme pr=E9vu par Windev), puis d'appeler ces proc=E9dures. C'est la
solution que j'utilise en ce moment.
- de transformer les chaines avant l'envoi (et/ou apr=E8s) en (ou =E0
partir de) XML, Unicode, ANSI, OEM, URL, etc.
- d'utiliser des chaines fixes, des cha=EEnes de caract=E8res ASCIIZ, des
chaines UNICODE, etc., en tant que param=E8tres.

Rien ne me donne "J=E9r=F4me" ou "Zo=E9" :-(

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

Cordialement
JC Tarby


//----------partie concern=E9e du WSDL------------
<?xml version=3D"1.0" encoding=3D"utf-8" ?>
<wsdl:definitions xmlns:soap=3D"http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm=3D"http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc=3D"http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime=3D"http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns=3D"USTL_LIFL_TRIGONE" xmlns:s=3D"http://www.w3.org/2001/
XMLSchema" xmlns:soap12=3D"http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http=3D"http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace=3D"USTL_LIFL_TRIGONE" xmlns:wsdl=3D"http://
schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault=3D"qualified"
targetNamespace=3D"USTL_LIFL_TRIGONE">
<s:element name=3D"Hello_Name">
<s:complexType>
<s:sequence>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"name" type=3D"s:string" =
/>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"login" type=3D"s:string"=
/
>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"pwd" type=3D"s:string" /=
>
</s:sequence>
</s:complexType>
</s:element>
<s:element name=3D"Hello_NameResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"Hello_NameResult"
type=3D"s:string" />
</s:sequence>
</s:complexType>
</s:element>
//..................
<s:element name=3D"voir_users_meeting">
<s:complexType>
<s:sequence>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"id_meeting"
type=3D"s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name=3D"voir_users_meetingResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs=3D"0" maxOccurs=3D"1" name=3D"voir_users_meetingResult=
"
type=3D"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=EEne
// j=92ai essay=E9 aussi: stTexteAEnvoyer est STHello_Name
//et aussi: stTexteAEnvoyer est cha=EEne UNICODE, etc....
//
//
// j=92ai essay=E9: stTexteAEnvoyer:m_name=3D"J=E9r=F4me"
// et aussi: stTexteAEnvoyer=3DAnsiVersUnicode("J=E9r=F4me")
stTexteAEnvoyer=3D"J=E9r=F4me"
stResultat=3DHello_Name(stTexteAEnvoyer, "my_login", "my_password")
// j=92ai essay=E9: stR=E9sultat=3DHello_Name(stTexteAEnvoyer:m_name,
"mon_login", "mon_password")
Info(stResultat:m_Hello_NameResult)
// et aussi
stResultat:m_Hello_NameResult=3DXMLVersTexte(stResultat:m_Hello_NameResult)
Info(stResultat:m_Hello_NameResult)


//------------- code Windev pour voir_users_meeting (code dans un
bouton)
//c=92est juste un exemple de tous mes essais=85..
stResultat est STvoir_users_meetingResponse
sTexteAEnvoyer est cha=EEne
sTexteAEnvoyer=3D"1234"
stResultat=3Dvoir_users_meeting(sTexteAEnvoyer)
stResultat:m_voir_users_meetingResult=3DXMLVersTexte(stResultat:m_voir_user=
s_meetingResult)
Info(stResultat:m_voir_users_meetingResult)


//------fin du code

3 réponses

1 2 3
Avatar
JC
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
Avatar
news.free.fr
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" a écrit dans le message de news:

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
Avatar
JC
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’e st
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épons e 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épons e 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 d e
perdre 10 jours de travail comme moi…

JCT
1 2 3