PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Web service + Serialise/Désérialise
Web service + Serialise/Désérialise
Débuté par Yves Roulet, 22 nov. 2006 17:58 - 8 réponses
Posté le 22 novembre 2006 - 17:58
Je recherche comment transmettre des données entre un serveur et des client mobiles. J'ai donc fait un web service qui tourne sous IIS et qui se presente comme ceci

/////////////
PROCEDURE GETCLIENTSBI(n_id est un entier,b_client est un booléen, n_code est un entier)

st_client est une STCOL_CLIENTS
tab_listeclient est un tableau de 0 STCOL_CLIENTS
smachaine est une chaîne

SI b_client ALORS
POUR TOUT CLIENTS AVEC "SOLID_ID >" + n_id + " ET SOCIETE = " + n_code
FichierVersMémoire(st_client,CLIENTS)
TableauAjoute(tab_listeclient,st_client)
FIN
SINON
POUR TOUT CLIENTS AVEC "SOLID_ID >" + n_id + " ET CLIENTRESP = " + n_code
FichierVersMémoire(st_client,CLIENTS)
TableauAjoute(tab_listeclient,st_client)
FIN
FIN
Sérialise(tab_listeclient,smachaine,psdBinaire) //ou psdXML

RENVOYER smachaine
///////////

si je mais le type psdBinaire le web service me tronque ma chaine, puisque le string XML ne suporte pas de données binaire, par contre si je mais le type psdXML je reçois un message mauvais format de sérialisation lors de la réceétion sur le mobile.

voici le code du coté client
////

smachaine est un TestWS.STGETCLIENTSBIResponse
gst_client est un STCOL_CLIENTS
gtab_listeclient est un tableau de 0 STCOL_CLIENTS


smachaine = GETCLIENTSBI(0,Faux,3)

Désérialise(gtab_listeclient,smachaine:m_GETCLIENTSBIResult,psdBinaire) // ou psdXML

POUR TOUT ELEMENT gst_client DE gtab_listeclient
HLitRecherchePremier(CLIENTS,SOCIETE,gst_client:nSOCIETE)
SI HTrouve(CLIENTS) ALORS
MémoireVersFichier(gst_client,CLIENTS)
HModifie(CLIENTS)
SINON
MémoireVersFichier(gst_client,CLIENTS)
HAjoute(CLIENTS)
FIN
FIN
///
l'appel au web service se fait dans la procédure GETCLIENTSBI

Qui à déjà utiliser les web service avec serialise et désérialise entre un serveur http et Windev mobile peut me donner un suggestions?
Merci
Posté le 23 novembre 2006 - 09:19
Bonjour,
Tu peux essayer de transcoder les chaines en unicode avant de sérialiser le tout. De plus, si tu utilises les WebServices "made in Windev" dans l'application Mobile, j'ai remarqué qu'il faut transcoder en Unicode la valeur renvoyée par SoapDonneResultat (
XMLDocument(docres,AnsiVersUnicode(SOAPDonneRésultat(SOAPRésultatXML)))) dans la procédure généré par Windev côté mobie pour que ça fonctionne.
Tu peux aussi jeter un oeil ici (http://forum.pcsoft.fr/post.awp…) et là (http://forum.pcsoft.fr/post.awp…)

Frédéric.
Posté le 23 novembre 2006 - 09:40
Merci pour ton info, tu utilise donc la sérialisation xml et non binaire? as tu déjà essayer en binaire?
Posté le 23 novembre 2006 - 10:36
En fait, je n'utilise pas la sérialisation du tout. J'ai fait celà "à la main", en concaténant les différentes informations avec un séparateur (RC le plus souvent). C'est surtout dû au fait que les fonctions sérialise/désérialise ne m'étaient pas du tout passé par la tête sur le moment ;)

Frédéric.
Posté le 23 novembre 2006 - 11:25
je n'ai pas de souci avec les web service, mon souci est avec sérialise et désérialise. cela evite d'ecrire pas mal de code.
Posté le 24 novembre 2006 - 09:48
Bonjour,

Le XML a du mal avec les chaines binaires
Personnellement je les encode en ANSI avant de mettre la chaine dans le fichier XML
tu peux le faire avec la fonction
ChaineANSI = Crypte(ChaineBinaire, "motdepasse",
crypteRapide+crypteAnsi,Vrai)

Ensuite tu peux le mettre dans le fichier XML

En espérant t'avoir aidé

Marc
Posté le 24 novembre 2006 - 13:44
Je ferai le test. Merci
Posté le 27 novembre 2006 - 10:26
Effectivement le transport d'une données binaire fonctione trés bien si ont crypte en ansi avant. L'unique point qui m'énerve, c'est que je n'arrive pas à désérialiser!!!
Merci de ta suggestion
Posté le 20 décembre 2007 - 12:39
En fait, le problème vient du transfert unicode - ansi et de la fonction desérialise :

il faut récupérer les réponses du service web en utilisant AnsiVersUnicode(SOAPDonneRésultat(SOAPRésultatXML))

le reste du traitement ne bouge pas, par contre, avant d'appeler la fonction désérialise, il faut faire un unicodeversansi(res:ResponseResult) (ou autre variable buffer qu'on utilise)
car la fonction désérialise ne fonctionne apparemment qu'avec une chaine ansi, même sur pocket pc.

J'ai fait cela et mon code fonctionne correctement.