PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Problème requête API
Problème requête API
Débuté par Sylvain, 20 sep. 2021 11:34 - 18 réponses
Membre enregistré
31 messages
Popularité : +2 (2 votes)
Posté le 20 septembre 2021 - 11:34
Bonjour,

J'ai un problème lors de l’exécution de 2 requêtes API d'affilés.

Ma première requête API me permet de m'authentifier avec mon login et mon mot de passe, celle ci fonctionne sans problème.
La seconde me permet de récupérer l’arborescence de mon logiciel de gestion électronique de documents (ged).

Et c'est lors de l'exécution de cette deuxième requête que cela ne fonctionne pas.

La première requête m'authentifie avec succès, puis dans la foulée j'envoie la seconde requête pour obtenir l'arborescence, mais cela me met un message d'erreur comme quoi je suis déconnecté alors que juste avant je me suis authentifié avec succès juste avant.

J'utilise également un logiciel externe (Postman) pour tester mes requêtes API plus facilement en dehors de windev.
Donc avec Postman,lorsque j’exécute mes 2 requêtes ci dessus, tout fonctionne sans problème.

Je ne comprends pas d'où peut venir mon problème.

Voici mon code :
ReqRecherche est une restRequête

ReqRecherche.URL = "http://srv-ezged/ezged/data/service.php/?service=sec/authenticate&login=Sylvain&pwd=6b526321d5a06783661d04f67a6f41"
ReqRecherche.Méthode = httpGet

Resultat est une restRéponse

nMonSessionID est un entier

Resultat = RESTEnvoie(ReqRecherche)

SI Resultat.CodeEtat = "200" ALORS
Reponse est un JSON = Resultat..Contenu
Trace(Reponse)

ReqRecherche.URL = "http://srv-ezged/ezged/data/service.php/?service=query/gettreearchive"
ReqRecherche.Méthode = httpGet

Resultat = RESTEnvoie(ReqRecherche)

SI Resultat.CodeEtat = "200" ALORS
Reponse = Resultat..Contenu
Trace(Reponse)
FIN

FIN
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 20 septembre 2021 - 12:01
Hello

Quand tu te connecte, tu n'es pas supposé récuperer token ou quelque chose ?
Car dans ta 2eme requete je ne vois pas a quel endroit tu fourni une clé d'authentification ?

Je vois que tu déclare nMonSessionID est un entier mais tu ne t'en sers visiblement pas. C'est peut etre la ton probleme ?
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 20 septembre 2021 - 12:19
Bonjour,

Je suis d'accord avec @François C. Il est parait étrange que tu ne passes pas une identifiant quelconque lors de la recherche pour dire au serveur "Eh coucou c'est moi de nouveau, je recherche..."

Que dit la doc ?

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
31 messages
Popularité : +2 (2 votes)
Posté le 20 septembre 2021 - 14:17
Bonjour,

Alors effectivement je pensais la même chose que vous au début de l'utilisation de cette API.

Cependant, la doc ne dit rien concernant ça. La seule chose qu'ils disent c'est que lorsque l'on est connecté, la session expire au bout de 60 secondes si on ne fait aucunes actions. Ce qui n'est pas mon cas puisque dans mon code, entre le temps ou il exécute la requête pour m'authentifier et celle ou il demande l'arborescence il n'y a que quelques ms et encore ...

De plus, lorsque je fais mes requêtes sur Postman, je lui passe les mêmes URL que celles présentes dans mon code et cela fonctionne.

Je vais essayer de chercher encore en attendant.
Merci.
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 20 septembre 2021 - 14:42
As-tu essayé de déclarer une autre variable de type restRequête pour voir s'il n'ya pas quelque chose qui resterait et qui ne serait pas accepté par le serveur.

ReqRecherche est une restRequête

ReqRecherche.URL = "http://srv-ezged/ezged/data/service.php/?service=sec/authenticate&login=Sylvain&pwd=6b526321d5a06783661d04f67a6f41"
ReqRecherche.Méthode = httpGet

Resultat est une restRéponse

nMonSessionID est un entier

Resultat = RESTEnvoie(ReqRecherche)

SI Resultat.CodeEtat = "200" ALORS
Reponse est un JSON = Resultat..Contenu
Trace(Reponse)

ReqRecherche2 est une restRequête
ReqRecherche2.URL = "http://srv-ezged/ezged/data/service.php/?service=query/gettreearchive"
ReqRecherche2.Méthode = httpGet

Resultat2 est une restRéponse
Resultat2 = RESTEnvoie(ReqRecherche2)

SI Resultat2.CodeEtat = "200" ALORS
Reponse = Resultat2..Contenu
Trace(Reponse)
SINON
Trace(Resultat2..Contenu)
FIN

FIN


--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
31 messages
Popularité : +2 (2 votes)
Posté le 20 septembre 2021 - 15:37
Alors justement, au début j'avais fait comme ça et cela ne fonctionne pas.

Je m'étais donc dit que peut être en utilisant toujours la même variable restRequete et restReponse cela changerait la donne (mon code actuel) eh bien toujours pas, dommage :(

@François C. Effectivement je déclare une variable nMonSessionID car je pensais à ce problème aussi, c'était juste des test que j'ai oublié d'enlever lorsque j'ai mit mon code sur le forum.
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 20 septembre 2021 - 16:26
Alors la du coup je ne sais pas.. personnellement je n'ai jamais vu de webservice qui fonctionne comme cela. Je ne sais pas meme pas comment il peut te reconnaitre dans ta 2eme requete si tu n'y passe pas une clé d'authentification ou autre.
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 20 septembre 2021 - 17:07
J'ai la même interrogation que François. Franchement la sécurité me semble plus que légère. Si une personne lance une connexion et que derrière tout le monde peut accéder aux données pendant 60 secondes, c'est juste sidérant.

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
1 143 messages
Popularité : +50 (142 votes)
Posté le 22 septembre 2021 - 13:39
Bonjour,

l'url indiqué est en http et non pas https, j'imagine que ça explique qu'il n'y ai pas de vérification de token derrière si, dans la même lignée, le webservice est conçu comme tel.

Ensuite je me pose la question sur httpGet, ce ne devrait pas plutôt être une méthode POST si c'est pour récupérer des données et non en envoyer ?

En général j'utilise TALEND API Tester pour vérifier les paramètres, avez-vous testé avec un outil de ce genre ?

--
Thierry TILLIER
Développeur Windev-Webdev
Formation Windev : https://coursdinfo.teachable.com/
Formation bureautique : https://coursdinfo.net
Tuto WINDEV sur ma chaîne Youtube
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 22 septembre 2021 - 15:16
Que la requête soit en Get ou en POST n'a aucune influence sur la réponse du serveur. La méthode GET passe les paramètres dans l'URL et la méthode POST passe les paramètres dans le corps de la requête. Il n'y a donc plus de limite théorique à la quantité de données transmises à la requête.

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
31 messages
Popularité : +2 (2 votes)
Posté le 22 septembre 2021 - 15:48
THIERRY TILLIER a écrit :
Bonjour,

l'url indiqué est en http et non pas https, j'imagine que ça explique qu'il n'y ai pas de vérification de token derrière si, dans la même lignée, le webservice est conçu comme tel.

Ensuite je me pose la question sur httpGet, ce ne devrait pas plutôt être une méthode POST si c'est pour récupérer des données et non en envoyer ?

En général j'utilise TALEND API Tester pour vérifier les paramètres, avez-vous testé avec un outil de ce genre ?

--
Thierry TILLIER
Développeur Windev-Webdev
Formation Windev : https://coursdinfo.teachable.com/
Formation bureautique : https://coursdinfo.net
Tuto WINDEV sur ma chaîne Youtube


Bonjour,

Comme indiqué par @Philippe SB, que ce soit POST ou GET cela n'a aucune influence. Dans tous les cas, j'ai essayé avec les deux et cela ne fonctionne pas dans les 2 cas.

Sinon oui bien sûr, je teste toutes mes requêtes avec l'outil POSTMAN. Et justement, lorsque j'exécute mes 2 requêtes sur POSTMAN (l’authentification puis récupérer l'arborescence) eh bien tout fonctionne à merveille !

Personnellement je n'ai aucune idée de ci cela vient de mon code où de l'API puisque mon code à l'air bon, je l'ai fait vérifié par plusieurs collègues et mes requêtes sur POSTMAN s’exécutent parfaitement ...
Membre enregistré
1 143 messages
Popularité : +50 (142 votes)
Posté le 22 septembre 2021 - 15:55
@Philippe : Merci pour cette mise à jour ;)

--
Thierry TILLIER
Développeur Windev-Webdev
Formation Windev : https://coursdinfo.teachable.com/
Formation bureautique : https://coursdinfo.net
Tuto WINDEV sur ma chaîne Youtube
Membre enregistré
386 messages
Popularité : +13 (13 votes)
Posté le 22 septembre 2021 - 18:05
Bonjour,

@Sylvain : est-il possible que le webservice renvoie lors de l'authentification un Cookie (regarder dans les headers de la réponse s'il y a des "Set-Cookie") ? Ceux-ci sont gérés automatiquement par Postman de mémoire (à la manière d'un navigateur web), ce qui expliquerait pourquoi ça marche là bas mais pas dans en code pur.

@Philippe : Théoriquement parlant, les deux méthodes sont quand même censées être gérées différemment côté serveur. Mais ici cela ressemble à une API pseudo-REST qui veut faire du RPC un peu comme SOAP. POST et GET ne devraient pas faire de différences ici, mais n'oublions pas qu'il s'agit d'une exception ;)
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 23 septembre 2021 - 00:05
hello,
si l'authentification est gérée par cookie il faut activer la gestion des cookies par httpCookieGère sur le domaine avant de faire la première requête.
httpCookieGère:
Active ou désactive la gestion des cookies dans une requête HTTP exécutée :
soit par la fonction HTTPRequête.
soit par la fonction HTTPEnvoie ou RESTEnvoie.


--
Ami calmant, J.P
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 23 septembre 2021 - 10:12
J'avais pas pensé aux cookies

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
31 messages
Popularité : +2 (2 votes)
Posté le 27 septembre 2021 - 16:13
Bonjour,

Effectivement, merci @bchanudet, lorsque je fais ma requête API pour me connecter, il y a un cookie "instance" qui se crée et a une valeur du style "e5pq0h457ggpmv5gcdaan2e6a2".

Encore une fois, PostMan récupère bien ce cookie et je pense aussi qu'il doit faire en sorte de faire correspondre ce cookie avec les autres requêtes API que j'exécute sur Postman.

Ainsi, sur windev, effectivement, je ne gère pas les cookies, c'est sûrement l'élément qu'il me manque pour que cela fonctionne.

Jurassic Pork a écrit :
hello,
si l'authentification est gérée par cookie il faut activer la gestion des cookies par httpCookieGère sur le domaine avant de faire la première requête.
httpCookieGère:
Active ou désactive la gestion des cookies dans une requête HTTP exécutée :
soit par la fonction HTTPRequête.
soit par la fonction HTTPEnvoie ou RESTEnvoie.


--
Ami calmant, J.P


J'ai donc activé la gestion des cookies
HTTPCookieGère(Vrai)

Je n'ai précisé aucun domaine car je ne le connais pas, je ne sais pas si c'est indispensable.
En tout cas cela ne fonctionne pas mieux.

J'essaye de voir du côté des cookies du coup pour essayer de récupérer le cookie "instance" qu'il me générè lors de mon authentification pour ensuite essayer de l'inclure dans les prochaines requêtes que j'exécute après mon authentification.
Mais pour l'instant je galère.

Cordialement,
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 27 septembre 2021 - 16:45
Quelque chose comme ça peut-être ?

ReqRecherche est une httpRequête

ReqRecherche.GèreCookie("",Vrai) // srv-ezged comme domaine ???
ReqRecherche.URL = "http://srv-ezged/ezged/data/service.php/?service=sec/authenticate&login=Sylvain&pwd=6b526321d5a06783661d04f67a6f41"
ReqRecherche.Méthode = httpGet

Resultat est une httpRéponse = HTTPEnvoie(ReqRecherche)
SI Resultat.CodeEtat = "200" ALORS
Reponse est un JSON = Resultat..Contenu
Trace(Reponse)

ReqRecherche.URL = "http://srv-ezged/ezged/data/service.php/?service=query/gettreearchive"
ReqRecherche.Méthode = httpGet

Resultat = HTTPEnvoie(ReqRecherche)

SI Resultat.CodeEtat = "200" ALORS
Reponse = Resultat..Contenu
Trace(Reponse)
FIN

FIN


--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
31 messages
Popularité : +2 (2 votes)
Posté le 28 septembre 2021 - 08:27
Philippe SB a écrit :
Quelque chose comme ça peut-être ?

ReqRecherche est une httpRequête

ReqRecherche.GèreCookie("",Vrai) // srv-ezged comme domaine ???
ReqRecherche.URL = "http://srv-ezged/ezged/data/service.php/…"
ReqRecherche.Méthode = httpGet

Resultat est une httpRéponse = HTTPEnvoie(ReqRecherche)
SI Resultat.CodeEtat = "200" ALORS
Reponse est un JSON = Resultat..Contenu
Trace(Reponse)

ReqRecherche.URL = "http://srv-ezged/ezged/data/service.php/…"
ReqRecherche.Méthode = httpGet

Resultat = HTTPEnvoie(ReqRecherche)

SI Resultat.CodeEtat = "200" ALORS
Reponse = Resultat..Contenu
Trace(Reponse)
FIN

FIN


--
Cordialement,

Philippe SAINT-BERTIN


Bonjour,

C'est tout à fait ça. Ça fonctionne parfaitement.
J'avais juste pas la bonne syntaxe.

Merci à tout le monde et à @bchanudet pour son orientation vers les cookies, je n'y aurais jamais pensé honnêtement.
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 28 septembre 2021 - 08:53
Perso je n'aurais pas pensé aux cookies non plus... Comme à plusieurs on a un plus gros cerveau... :p

--
Cordialement,

Philippe SAINT-BERTIN