PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → api / variant n'est pas un objet
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>

//si enmodetest() alors info(restRep..contenu)

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)

// Ouverture d'une session SMTP
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
// Envoi du message
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