PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Body pour httRequête : voici comment faire
Body pour httRequête : voici comment faire
Iniciado por DavDes, jul., 18 2020 12:33 AM - 14 respostas
Membro registado
14 mensagems
Popularité : +2 (6 votes)
Publicado em julho, 18 2020 - 12:33 AM
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 em dezembro, 17 2020 - 7:28 AM
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
Membro registado
21 mensagems
Publicado em maio, 22 2021 - 9:49 AM
Merci DavDes. Je confirme que c'est effectivement la solution pour passer des variables de type form-data dans le body.
Publicado em dezembro, 02 2021 - 2:46 PM
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.
Membro registado
10 mensagems
Popularité : +3 (3 votes)
Publicado em dezembro, 21 2021 - 5:23 PM
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 em fevereiro, 04 2022 - 9:41 AM
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
Membro registado
14 mensagems
Popularité : +2 (6 votes)
Publicado em março, 03 2022 - 12:31 AM
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)
Membro registado
386 mensagems
Popularité : +13 (13 votes)
Publicado em março, 03 2022 - 9:08 AM
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 em março, 03 2022 - 1:58 PM
bien vérifier que tu utilise le mode post qui est prévu pour les envois de grande taille.
Membro registado
324 mensagems
Popularité : +21 (51 votes)
Publicado em março, 03 2022 - 4:17 PM
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 !
Membro registado
386 mensagems
Popularité : +13 (13 votes)
Publicado em março, 03 2022 - 5:39 PM
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 em maio, 16 2022 - 4:50 PM
bonjour
et si on devait faire une requeute Get avec content /contenu , est ce possible? Merci à vous
Membro registado
386 mensagems
Popularité : +13 (13 votes)
Publicado em maio, 16 2022 - 6:26 PM
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 em maio, 17 2022 - 9:20 PM
MERCI BEAUCOUP
Publicado em agosto, 17 2022 - 10:43 AM
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