PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → Body pour httRequête : voici comment faire
Body pour httRequête : voici comment faire
Iniciado por DavDes, 18,jul. 2020 00:33 - 14 respuestas
Miembro registrado
14 mensajes
Popularité : +2 (6 votes)
Publicado el 18,julio 2020 - 00:33
Bonjour,

Vous êtes tombé sur la cas où vous auriez besoin de mettre des clés dans la section Body d'une requête.
Vous avez réussi dans Postman :




Évidemment vous avez tout tenté dans WinDev avec Contenu, mais ça ne fonctionne pas ;( ...

Voici comment faire :

cMaRequete est une httpRequête
cMaréponse est une httpRéponse

cMaRequete..URL = "https://login.xxxxxxxx/oauth2/v2.0/token"
cMaRequete..ContentType = "multipart/form-data"
cMaRequete..Méthode = httpPost
HTTPCréeFormulaire("Token")
HTTPAjouteParamètre("Token","grant_type","client_credentials")
HTTPAjouteParamètre("Token","client_id","94xxxxxxxe4")
HTTPAjouteParamètre("Token","client_secret","8dxxxip")
HTTPAjouteParamètre("Token","scope","https://xxxxxefault")
HTTPAjouteParamètre("Token","client_authentication","Send as basic Auth Header")
cMaréponse=HTTPEnvoieFormulaire("Token",cMaRequete)

Info(cMaréponse.Contenu)


Et voici le résultat :




Bons tests 8) !
Publicado el 17,diciembre 2020 - 07:28
Bonjour mon developper DavDes, merci beaucoup pour ce bout de code !

Seulement je veux faire la meme chose sur windev mobile 25, ça ne marche pas.

Le même code marche ent windev mais pas en Windev mobile
Miembro registrado
21 mensajes
Publicado el 22,mayo 2021 - 09:49
Merci DavDes. Je confirme que c'est effectivement la solution pour passer des variables de type form-data dans le body.
Publicado el 02,diciembre 2021 - 14:46
Merci infiniment pour ce post, qui devrait être sans doute ajouté à la doc Windev. J'ai passé plusieurs heures à tourner en rond avant de trouver la solution grace à vous.
Miembro registrado
10 mensajes
Popularité : +3 (3 votes)
Publicado el 21,diciembre 2021 - 17:23
Un grand merci @DavDes, je bloquais sur le problème depuis le début de la semaine :D Ne pouvant pas utiliser HTTPEnvoie() (car ne passe pas à travers le proxy chez un client (pourquoi ?)), on devait passer par les formulaires, et je suis resté bête sur le fait qu'ils ne prennent pas en compte mon req..Contenu :o

Bonnes fêtes et bonne année à tous !
Publicado el 04,febrero 2022 - 09:41
Bonjour,

merci pour ce bout de code.

Seul soucis, je me tape un time out de 20s quoique je fasse. Je met un httpTimeOut() de 10 minutes, l'info m'indique bien 600 000ms mais j'ai tout de même une erreur détectée au bout de 20 sec.

J'ai installé l'administrateur Webdev, j'ai changé la configuration en passant "durée maximum d'une requêteé à 9 minutes mais ça ne change rien.





Si quelqu'un à une idée je suis preneur.

Bonne journée
Miembro registrado
14 mensajes
Popularité : +2 (6 votes)
Publicado el 03,marzo 2022 - 00:31
Avez-vous essayé votre requête dans Postman ?
Parce que le TimeOut peut aussi venir du serveur. Si le fichier est trop gros par exemple (parce que je me dis que 10mn pour envoyer un fichier, c'est clair que ce n'est pas un .CSV de 100Ko)
Miembro registrado
386 mensajes
Popularité : +13 (13 votes)
Publicado el 03,marzo 2022 - 09:08
Bonjour,

Les variables de type httpRequête ont deux attributs propres pour gérer cela :
- httpReq.TimeoutConnexion : sert à gérer l'attente côté serveur : typiquement on a réussi à envoyer les données, et le serveur les utilise dans des traitements avec qui l'empêche de répondre rapidement.
- httpReq.DuréeNonRéponse : sert à gérer le temps nécessaire pour l'envoi des données. Souvent nécessaire lorsqu'on cherche à envoyer une quantité de données non-négligeable (upload de fichiers, etc)

Documentation : https://doc.pcsoft.fr/fr-FR/?1000021158&name=httprequete_type_variable

En ajustant ces deux variables vous devriez arriver à résoudre votre problème. :)
Publicado el 03,marzo 2022 - 13:58
bien vérifier que tu utilise le mode post qui est prévu pour les envois de grande taille.
Miembro registrado
324 mensajes
Popularité : +21 (51 votes)
Publicado el 03,marzo 2022 - 16:17
HTTPCréeFormulaire("Token") < c'est juste la base du web ce truc ...

C'est pas méchant mais je trouve fou le nombre de gens qui utilisent webdev sans rien connaitre du web ! Je sais pas le bon sens veut qu'on apprenne un minimum comment fonctionne quelques chose quand même !

bien vérifier que tu utilise le mode post qui est prévu pour les envois de grande taille. < "post, patch, put" rien à voir avec la taille du fichier ...

Merci infiniment pour ce post, qui devrait être sans doute ajouté à la doc Windev. J'ai passé plusieurs heures à tourner en rond avant de trouver la solution grace à vous.


Vous voulez ajouter quoi ? httpformulaire c'est un truc ultra standard, c'est au dev de savoir ce qu'il programme et pourquoi il le programme, ce n'est pas à PC Soft de vous indiquer dans "l'aide" une des 377 000 manière d'utiliser l'envoi de formulaire !
Miembro registrado
386 mensajes
Popularité : +13 (13 votes)
Publicado el 03,marzo 2022 - 17:39
C'est pas méchant mais très honnêtement c'est quand même faire preuve d'un certain élitisme :)

Déjà parce que ici c'est la section WinDev, et pour avoir eu des collègues dans ce cas, on peut très bien avoir 20 ans d'expérience en WinDev, avoir utilisé pleins de webservices SOAP (donc importés dans WinDev), des fonctions SAP dans tous les sens, et se retrouver comme des nues devant la demande de faire un appel HTTP plus "basique". En contrepartie j'ai bientôt près de 10 ans d'expérience en WebDev, on pourrait croire que ça se transpose relativement bien en WinDev et pourtant je me trouve comme un con quand un client me demande de communiquer avec un lecteur de carte magnétique sur port COM. A chacun ses connaissances mais aussi ses lacunes. :)

Quitte à râler il vaudrait mieux râler sur PC Soft directement. Leur communication est clairement axée "Développez avec le même langage sur plusieurs plateformes" et leurs outils tels que le bouton "Webiser" font qu'il est assez facile de croire que l'on peut faire du web aussi simplement que du WinDev.

Pour en revenir au sujet initial, il est aussi possible de se passer du HTTPFormulaire, mais il faut alors se coltiner soi-même l'encodage en form-data des paires de clés/valeurs.
Procedure TestFormulaireHTTP()

PROCEDURE INTERNE EncoderFormulaire(taValeursFormulaire est un tableau associatif de chaînes) : chaîne

sRetour est une chaîne
POUR TOUT sValeur, sNom de taValeursFormulaire
sRetour += ["&"] + URLEncode(sNom,encodeURLDepuisUnicode) + "="

// Si la valeur est une URL, alors il faut l'encoder en "double", voir doc URLEncode()
SI URLExtraitChemin(sValeur,urlProtocole) <> "" ALORS
sRetour += URLEncode(URLEncode(sValeur, encodeURLDepuisUnicode),encodeURLParamètre)
SINON
sRetour += URLEncode(sValeur,encodeURLDepuisUnicode)
FIN
FIN

RENVOYER sRetour
FIN


taValeurs est un tableau associatif de chaînes
reqHTTP est une HTTPRequête
resHTTP est une httpRéponse
jsonContenu est un JSON

// Debug avec httpbin.org, un service qui fait un "écho" de la requête envoyée
reqHTTP.URL = "https://httpbin.org/post"
reqHTTP.Méthode = httpPost
reqHTTP.Entête["accept"] = "application/json"

// Définition des valeurs du formulaire
taValeurs["test"] = "test"
taValeurs["origine"] = "Test WinDev 26"
taValeurs["date_envoi"] = DateHeureSys()

// Type MIME + encodage du formulaire
reqHTTP.ContentType = typeMimeFormulaireSimple
reqHTTP.Contenu = EncoderFormulaire(taValeurs)


resHTTP = reqHTTP.Envoie()

// Trace des résultats
Trace(resHTTP.CodeEtat)
// => 200

SI resHTTP.CodeEtat <> 200 ALORS
RETOUR
FIN

jsonContenu = resHTTP.Contenu

Trace(jsonContenu.form)
// => { "date_envoi":"20220303170001000", "origine":"Test WinDev 26", "test":"test" }


Par contre ça ne colle que pour les formulaires "simples". Si vous commencez à utiliser des HTTPAjouteFichier(), c'est encore une autre paire de manches... :)
Publicado el 16,mayo 2022 - 16:50
bonjour
et si on devait faire une requeute Get avec content /contenu , est ce possible? Merci à vous
Miembro registrado
386 mensajes
Popularité : +13 (13 votes)
Publicado el 16,mayo 2022 - 18:26
Bonjour,

En règle générale, PC Soft suit les standards RFC, et ceux-ci indiquent qu'en GET le contenu, bien qu'autorisé, ne devrait pas utilisé. Par défaut donc il n'est pas possible d'envoyer de contenu avec un GET en Wlangage.

Il y aurait peut-être (avec un GROS conditionnel, je n'ai pas testé) une solution de contournement similaire à ce que PC Soft a proposé pour le verbe DELETE (lui aussi ne devrait pas avoir de contenu) avec l'appel à HTTPEnvoieFormulaire() : https://blogs.pcsoft.fr/fr/utilisation-api-rest-contenu-ignore-lorsque-methode-http-delete/281474976710938/read.awp

Si cela ne marche pas ou ne convient pas, il ne reste pas 36 solutions :
- utiliser un outil comme curl en ligne de commande avec des appels à LanceAppli().
- descendre d'un niveau (en C# ou Python pour WinDev par exemple) et développer ses propres fonctions HTTP à partir de là
Publicado el 17,mayo 2022 - 21:20
MERCI BEAUCOUP
Publicado el 17,agosto 2022 - 10:43
Bonjour,

je dois faire appel à un web service rest et envoyer dans le body un fichier json.

Quand j'essaye avec le ..contenu , cela ne focntionne pas.


Auriez vous un exemple de comment alimenter le body d'une requette http avec un fichier json ( en passant par un buffer ) ?

Par avance, merci et bonne journée à tous.

Jean-Christophe