|
| api / variant n'est pas un objet |
| Débuté par Laurent HERMANN, 01 aoû. 2025 12:08 - 7 réponses |
| |
| | | |
|
| |
Membre enregistré 352 messages |
|
| Posté le 01 août 2025 - 12:08 |
bonjour,
je galere à débuger une erreur sur un appel API : " le variant n'est pas un objet" fonction qui envoi un msg mail suite à une erreur
appel :
p est une Variant ="ista" u est une Variant = gnUser po est une Variant= NetNomMachine() ip est une Variant= Remplace(NetListeAdresseIP(),RC," - ") v est une Variant = ExeInfo(exeVersion) e est une Variant= RC + RC + RC + RC + ExceptionInfo(errComplet) sRetour est une chaîne = QueryRapportErreur("{""p"":"""+p+""",""u"":"""+u+""",""po"":"""+po+""",""ip"":"""+ip+""",""v"":"""+v+""",""e"":"""+e+"""}")
fonction appel api :
Procedure QueryRapportErreur(Jay est un JSON) QUAND EXCEPTIONEXCEPTION DANS restQuery est un restRequête restQuery..Entête["TokenSoft"] = ChaîneVersUTF8(gsTokenSoft) SI gbTest ALORS restQuery..Entête["basetest"] = ChaîneVersUTF8("test") restQuery..AgentUtilisateur = "xxxx" restQuery..ContentType = "application/json" restQuery..Méthode = httpPost restQuery..Contenu = ChaîneVersUTF8(Jay) restQuery..URL = gsWSMantaRapport + "rapporterreur" <COMPILE SI bCompilerPourTest> Trace(restQuery..Contenu) <FIN> restRep est un restRéponse = RESTEnvoie(restQuery) <COMPILE SI bCompilerPourTest> Trace(restRep..Contenu) <FIN> SELON restRep..CodeEtat CAS 200 : RENVOYER restRep..Contenu CAS 204 : RENVOYER "Rien" CAS 401 : Info("Accès au webservice non autorisé") CAS 500 : Info("Erreur d'exécution du webservice : " + RC + RC + restRep..Contenu) AUTRE CAS FIN RENVOYER "" FAIRE SI EnModeTest() ALORS Trace(Jay) Info("Requête : " + RC + RC + Jay + RC + RC + ExceptionInfo(errComplet)) SINON
FIN RENVOYER "" FIN
end point api :
Procedure RapportErreur()
Jay est un JSON Désérialise(Jay,WebserviceParamètre(paramBuffer),psdJSON)
MaSession est un emailSessionSMTP MaSession.AdresseServeur = "xx" MaSession.Nom = "xx" MaSession.MotDePasse = "xx" MaSession.Port = 465 MaSession.Option = optionTLS SI EmailOuvreSession(MaSession) = Faux ALORS WebserviceEcritCodeHTTP(500,"Code non reconnu") RENVOYER ChaîneVersUTF8("{""r"":""err_smtp""}") FIN
MonMessage est un Email MonMessage.Expediteur = "xx" Ajoute(MonMessage.Destinataire, "xx") MonMessage.Sujet = "_erreur_" MonMessage.Message = "erreur :"+Jay.v+RC+",User : "+Jay.u+RC+",Poste :"+Jay.po+RC+",IP :"+Jay.ip+RC+",Version :"+Jay.v+RC+"---------------- "+Jay.e
SI EmailEnvoieMessage(MaSession, MonMessage) ALORS WebserviceEcritCodeHTTP(200) RENVOYER ChaîneVersUTF8("{""r"":""envoye""}") SINON WebserviceEcritCodeHTTP(500,"Code non reconnu") RENVOYER ChaîneVersUTF8("{""r"":""err_send""}") FIN
j'ai cette remontée d'erreur à la ligne Monmessage.message il ne remonte pas mon json jay
si quelqu’un peut me donner un piste ? merci
-- LH |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 317 messages |
|
| Posté le 01 août 2025 - 14:09 |
Bonjour, Lorsque tu appelles QueryRapportErreur tu passes un variant en paramêtre, or ta fonction attend un JSON. De même dans RapportErreur, Désérialise attend une variable de type structure, classe, tableau, file, liste ou pile or tu passes un JSON.
-- Il y a peut être plus simple, mais, ça tourne Quand tout a échoué, utilise l'option RTFM |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 352 messages |
|
| Posté le 01 août 2025 - 15:08 |
merci
merci
j'ai mis variant pour chercher à corriger mon erreur mais initialement j'ai mis "est une chaine" je vais passer par une variable intermédiaire en JSON à l'appel de QueryRapportErreur...
-- LH |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 352 messages |
|
| Posté le 01 août 2025 - 15:12 |
j'ai corrigé jay est un JSON = "{""p"":"""+p+""",""u"":"""+u+""",""po"":"""+po+""",""ip"":"""+ip+""",""v"":"""+v+""",""e"":"""+e+"""}" sRetour est une chaîne = QueryRapportErreur(jay)
et j'ai toujours la même erreur
concernant la fonction DESERIALISE, je passe le parametre psdJSON
-- LH |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 53 messages |
|
| Posté le 01 août 2025 - 18:02 |
Yip,
Une variable JSON c'est spéciale, ça sert à lire ou écrire un json de manière dynamique. Ca ne se sérialise/désérialise pas.
A une variable JSON il faut lui assigner un json sous forme de chaine puis tu pourras lire les valeurs dynamiquement.
Jay est un JSON Jay = WebserviceParamètre(paramBuffer) ... MonMessage.Message = "erreur :"+Jay.v+RC+",User : "+Jay.u+RC+",Poste :"+Jay.po+RC+",IP
Si tu veux désérialiser il faut que tu déclares une structure correspondante à ta chaine json. Mais là plus rien n'est dynamique.Message modifié, 01 août 2025 - 18:05 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 1 166 messages |
|
| Posté le 01 août 2025 - 18:39 |
Bonjour Laurent,
C'est un point que j'ai justement abordé dans la fin de ma vidéo cette semaine :
Le "JSON" lors des passages de paramètre est en réalité une chaine de caractères. Avant de la traiter comme un JSON il faut utiliser ChaineVersJSON. Tu devrais typer en Chaine le paramètre de ta procédure Query...
Le message d'erreur indiquant "variant" est un peu trompeur.
Je te conseille éventuellement de construire ta "chaine-JSON" avec les crochets :
MonParametre est une chaîne = [ { "p": "[%p]", .. } ] quelque chose du genre.
J'espère que ce sera la solution pour toi.
-- Thierry TILLIER Développeur WINDEV -WEBDEV Formation WINDEV : https://www.cours-windev-thierrytillier.com/ Tuto WINDEV sur ma chaîne YouTube |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 317 messages |
|
| Posté le 01 août 2025 - 19:05 |
Dans un premier temps
"{""p"":"""+p+""",""u"":"""+u+""",""po"":"""+po+""",""ip"":"""+ip+""",""v"":"""+v+""",""e"":"""+e+"""}" n'est pas vraiment lisible, qui plus est on n'est pas à l'abri d'un " en trop ou en moins. Il est préférable de passer par un ChaineConstruit suivi d'un ChaineVersJSON. Un truc du style :
saContenuJSON=[ { p:%1, u:%2, po:%3, ip:%4, v:%5, e:%6} ]
saContenuJSON=ChaîneConstruit(saContenuJSON,p,u,po,ip,v,e) jsMonJSON=ChaîneVersJSON(saContenuJSON) Dans le cas qui nous intéresse, cela ne résout pas notre problème. Le hic vient de ta variable e. En effet, ExceptionInfo renvoi une chaine qui comporte des caractère ":". Ce caractère servant à affecter un membre, ChaineVersJSON ne retrouve pas ses chatons et renvoi un mauvais format.
Une solution consiste à affecter les valeurs désirées à un variant et d'utiliser VariantVersJSON
jsMonJSON est un JSON
vContenuJSON est Variant
vContenuJSON.p = "ista" vContenuJSON.u = gnUser vContenuJSON.po = NetNomMachine() vContenuJSON.ip = Remplace(NetListeAdresseIP(),CRLF," - ") vContenuJSON.v = ExeInfo(exeVersion) vContenuJSON.e = ChaîneConstruit("%1%1%1%1%2",CRLF,ExceptionInfo(errComplet))
jsMonJSON=VariantVersJSON(vContenuJSON)
Une autre solution est de placer un fichier exemple de ton JSON (e.g. MonExemple.JSON) dans la partie "Description Externe" de l'explorateur de projet et d'affecter directement les valeurs aux membres.
jsMonJSON est un JSON <Description = "MonExemple.JSON">
jsMonJSON.p="ista" etc...
En ce qui concerne l'option de désérialisation psdJSON, elle concerne le buffer (2° paramètre) et non la variable (1° paramètre.)
-- Il y a peut être plus simple, mais, ça tourne Quand tout a échoué, utilise l'option RTFM |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 352 messages |
|
| Posté le 05 août 2025 - 18:51 |
tout fonctionne merci à Voroltinquo pour sont efficacité mêm pdt les vacances 
merci pour l'intervention de thierry noté la chainejson !
-- LH |
| |
| |
| | | |
|
| | | | |
| | |
|