|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
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
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 572 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
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
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
Fabien |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 572 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
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
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 ? )
Cordialement,
Fabien |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 572 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...
-- Cordialement,
Philippe SAINT-BERTIN Géode Informatique |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 1 298 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.beMessage 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 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)
Cordialement,
Fabien |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 572 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 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|