PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Problème serialisation XML + structure Webservice
Problème serialisation XML + structure Webservice
Débuté par Fabien Tegnol, 18 mai 2017 12:18 - 8 réponses
Posté le 18 mai 2017 - 12:18
Bonjour,

Voici mon problème : dans un projet en windev, je déclare un tableau de structure provenant d'un web service.
Puis je le remplis dans windev, le sérialise en psdXML puis l'envoi au webservice webdev (buffer)
Coté web service, je désérialise le buffer et là problème, j'ai bien le nombre d'occurence de mon tableau, mais le contenu est VIDE (null).
Mon but ultime étant de compresser/decompresser les buffers dans un 2eme temps.


Voici le code :

Coté webservice, déclaration global :

stResultat est une structure
Ok est un booléen
Observation est une chaîne
FIN

stTest est une structure
ID est un entier
Titre est une chaîne
Resultat est un stResultat
FIN


Ensuite, la procédure du webservice :

Procedure setTest(XMLSimpleTest est un Buffer)

Resultat est un stResultat
Resultat.Ok = Vrai


tabTest est un tableau de stTest
Désérialise(tabTest ,XMLSimpleTest,psdXML)

POUR i = 1 _A_ tabTest ..Occurrence

Resultat.Observation+=[";"]+"["+tabTest[i].ID+"/"+tabTest[i].titre+"] ---"+ErreurInfo


FIN
//vous verrez le résultat renvoyé est [0/] ---;[0/] ---;[0/] ---;[0/] ---;[0/] --- ce qui ILLOGIQUE !
//ca devrait être le contenu du buffer de base

RENVOYER Resultat


Cote windev maintenant, déclaration de la structure + remplissage + envoi au webservice via buffer :

tabWS est un tableau de WS_MonWebservive.stTest
POUR i = 1 _A_ 5
MonTest est un WS_MonWebservive.stTest
MonTest.Titre = "aaaaaaaa "+i
MonTest.ID = 4
Ajoute(tabWS ,MonTest )
FIN

TestBufferWS est un Buffer
Sérialise(tabWS ,TestBufferWS,psdXML)
Resultat est un WS_MonWebservive.stResultat = WS_MonWebservive.setTest(TestBufferWS)


Comme vous le voyez c'est simple, on serialise un tableau de structure, puis on déserialise coté webservice.
Je ne comprend pas pourquoi coté webservice, la tableau deserialise bien 5 occurences mais VIDE, comme si la fonction n'arrivait pas à remettre 'correctement' le buffer dans un tableau de structure de même type que celui envoyé...

Merci pour votre aide.

Fabien
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 18 mai 2017 - 15:25
Bonjour,

De tous les tests que j'ai pu réaliser, ça n'a jamais fonctionné.

Par contre tu peux passer directement ton tableau en paramètre de ton WS et ça ça fonctionne
// Code du WS
Procedure setTest(tabXMLSimpleTest est un tableau de stTest)

Resultat est un stResultat
Resultat.Ok = Vrai

POUR i = 1 _A_ tabXMLSimpleTest ..Occurrence
Resultat.Observation+=[";"]+"["+tabXMLSimpleTest[i].ID+"/"+tabXMLSimpleTest[i].titre+"] ---"+ErreurInfo
FIN

RENVOYER Resultat


// Code Windev
tabWS est un tableau de TestWS.stTest
POUR i = 1 _A_ 5
stMonTest est un stTest
stMonTest.Titre = "aaaaaaaa "+i
stMonTest.ID = 4
Ajoute(tabWS ,stMonTest )
FIN

stResultat est un TestWS.stResultat = TestWS.setTest(tabWS)


Après il reste le json

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 18 mai 2017 - 15:47
Bonjour Philippe,

Pour le json, il n'accepte pas car la structure vient du webservice et le xsdentité fait planter.
Effectivement ton code marche (je le faisait à la base).


Mais comme mon but ultime c'est de compresser les données à envoyer (et décompresser coté web service), je suis bien obligé de sérialiser les structures ...? :-)

Pourquoi ? je dois pouvoir envoyer un gros volume de données via webservice et la combinaison serialise + compresse() avec decompresse+deserialise à la potentiel énorme que je cherche (taux de compression gzip entre 80 et 90% !).

Mais pour ça, il faut d'abord que sérialise/desérialise fonctionne... ensuite la compression suivra.

C'est vraiment abusé qu'une fonction aussi simple qu'un vulgaire sérialise/déserialise pose problème....

Si d'autres ont des idées, je suis preneurs :merci:

Fabien
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 19 mai 2017 - 12:04
Une solution pour passer en json avec compression. C'est une solution alternative pas très belle mais qui a le mérite de fonctionner. Il te faut malheureusement faire avec les outils et leurs défauts :(
// Code WS
Procedure setTest(bufMonJson est un Buffer)

Resultat est un stResultat
Resultat.Ok = Vrai

tabMesTests est un tableau de stTest
Désérialise(tabMesTests,Décompresse(bufMonJson),psdJSON)

POUR TOUT UnTest de tabMesTests
Resultat.Observation+=[";"]+"["+UnTest.ID+"/"+UnTest.Titre+"] ---"+ErreurInfo
FIN

RENVOYER Resultat


// Code Windev
stResultat est une structure
Ok est un booléen
Observation est une chaîne
FIN

stTest est une structure
ID est un entier
Titre est une chaîne
Resultat est un stResultat
FIN

tabWS est un tableau de stTest
bufTestBufferWS est un Buffer

POUR i = 1 _A_ 5
stMonTest est un stTest
stMonTest.Titre = "aaaaaaaa "+i
stMonTest.ID = 4
Ajoute(tabWS,stMonTest)
FIN


Sérialise(tabWS,bufTestBufferWS,psdJSON)
bufTestBufferWS = Compresse(bufTestBufferWS,compresseGZIP)
stResultat est un TestWS.stResultat = TestWS.setTest(bufTestBufferWS)


--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 19 mai 2017 - 12:59
Bonjour Philippe,

La solution proposée (que je connait et qui fonctionne effectivement, même avec psdXML ça marche ;) ) à un défaut majeur :
Obligé de DUPLIQUER toutes les structures utilisées (une fois dans le webservice, une fois dans le(s) programme(s) windev et windev mobile), bonjour la maintenance des programmes et les évolutions de structures.... }:(

j'ai envoyé le projet au support pc soft pour qu'ils reproduisent le cas, j'attend maintenant leur retour.

N'hésites pas à partager si tu vois d'autres solutions 'propre' (Création manuelle du xml dans une vieille chaîne ou via l'objet xmlDocument qu'on compressera plus tard ? :p )

Cordialement,

Fabien
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 19 mai 2017 - 15:39
Je leur ai déjà remonté ce genre de problème il y a au moins 3 ans. on en est toujours au même stade. Leur principe c'est que si tu peux passer autrement alors tu n'as qu'à te débrouiller.

Si toutefois tu as une correction je suis preneur.

Après tu peux en effet passer par une variable xmldocument mais je en suis pas sur que ce soit mieux. et le fameux xsdentité non pris en charge par la sérialisation est tellement vieux que je ne peux pas compter...:D

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Membre enregistré
1 287 messages
Popularité : +20 (72 votes)
Posté le 19 mai 2017 - 16:30
Bonjour?

pour ma part la solution à été trouvée.


En WS, je ne renvoi qu'une structure, jamais un tableau de structure.

Comment faire donc si j'ai un tableau

Dans ce cas je crée une structure A, qui elle même contient le tableau de structure B et l'astuce est d'ajouter au moins une variable né'tant pas un tableau ou une structure dans la structure A

MaFiche est une structure
Nom est une chaîne
Tel est une chaîne
FIN

MonRetour est une structure
nOccurence est un entier
bEstValide est un bollen
MesFiches est un tableau dynamiquedynamique de MAfiche
sErreur est une chaîne
FIN


Et donc ma fonction de Webservice
Procedure mafontcion

Leretour est un Monretour
...


RENVOYER leretour


--
Bertin CARRIERE
Consultant & Formateur
bertin.carriere@gmail.com
http://www.zen-project.be http://www.linkedin.com/in/bertincarriere

Belgique +32(0)2/318.02.67
France +33(0)3/66.722.542
Espagne +34.5/12.702.266

Membre de http://www.be-dev.be
Message modifié, 19 mai 2017 - 16:31
Posté le 19 mai 2017 - 17:47
Bonjour,

Merci pour ton retour Philippe (même si ca me fait déprimer ... ;( ),
je ne manquerais pas de vous informer de la réponse de PC SOFT suite à l'envoi du projet

Bertin, merci pour ton aide mais ton exemple il n'y a pas de serialisation. Es tu SUR que cela fonctionne avec sérialise/desérialise (sans même parler de compression) ?
j'ai essayé tes astuces (avec serialise/deserialise) mais le webservice ne renvoi RIEN (pas d' erreurs) je n'ai donc jamais de résultat }:( . Est ce que tu as un résultat avec sérialise/desérialise correct ?

Voici le code avec serialise/deserialise:

Coté webservice ---------------

MaFiche est une structure
Nom est une chaîne
Tel est une chaîne
FIN

MonRetour est une structure
nOccurence est un entier
bEstValide est un booléen
tabMesFiches est un tableau dynamiquedynamique de MaFiche //dynamiquedynamique se met automatiquement sur le forum pc soft à remplacer par dynamique dans le projet
sErreur est une chaîne
FIN


Procedure TestDeserialiseFiche(bufF est un Buffer)


Leretour est un MonRetour
Désérialise(Leretour,bufF,psdXML)

RENVOYER Leretour


Coté windev :------------------

Leretour est un MonRetour
Leretour.bEstValide = Vrai
Leretour.nOccurence = 0
Leretour.sErreur = "coucou"

POUR i = 1 _A_ 10

nIndice est un entier = TableauAjoute(Leretour.tabMesFiches)
Leretour.tabMesFiches[nIndice].Nom = "joe"+i
Leretour.tabMesFiches[nIndice].Tel = i
FIN

x est un Buffer
Sérialise(Leretour,x,psdXML)



Leretour222 est un MonRetour <= TestDeserialiseFiche(x)
//ne renvoi jamais de résultat, tourne indéfiniement jusqu'au timeout webdev



Cordialement,

Fabien
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 20 mai 2017 - 12:39
J'ai tellement de problèmes avec la sérialisation windev. De temps en temps j'ai format de sérialisation incorrect. Pour quelle raison ???

Je ne parle pas de problèmes rencontrés avec des ws développés en c# pour lesquels il faut remplir la structure dans l'ordre de création des variables pour que cela fonctionne.

Je ne sais donc pas comment cela fonctionne de leur côté, mais il doit y avoir des soucis. Depuis que j'ai découvert le json je n'utilise plus que ça même si je dois recréer les structures. Je leur ai déjà dit que ce n'était pas pratique mais étant donné qu'il y a des solutions de contournement, le problème devient peu important et sera traité peut-être un jour par le service développement.

Ce qui explique que les fonctionnalités ne sont jamais menées au bout je pense.

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique