|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
| Pb traduction requete HTTP |
| Débuté par Christian DOSJOUB, 27 nov. 2021 12:00 - 12 réponses |
| |
| | | |
|
| |
Membre enregistré 93 messages |
|
| Posté le 27 novembre 2021 - 12:00 |
Bonjour, rarement je boucle autant j'ai a traduire en windev ceci : version postman GET :https://..../stockanddeliverymethods/get body en raw/json {"skus" : ["XXXXX"] }
ça marche nickel (et également en text) en CURL la ligne de commande curl --location --request GET "https://..../stockanddeliverymethods/get" --header "Content-Type: application/json" --data-raw "{\"skus\":[\"XXXXX\"]}"
marche nickel. MAIS toutes mes tentatives sous windev sont infructueuses avec systématiquement une erreur d'argument mal formé
MaReq est une httpRequête Lu est un Buffer MaReq.URL = "https://..../stockanddeliverymethods/get" MaReq.Méthode = httpGet MaReq.ContentType = "application/json" Lu = "{""skus"":[""XXXXX""]}" MaReq.Contenu = Lu MaRep est un httpRéponse = HTTPEnvoie(MaReq) SI ErreurDétectée ALORS Erreur(ErreurInfo(errComplet)) SINON Info(MaRep.Contenu) FIN
J'ai tenté toutes les transformations de ma variable Lu en passant par du json, tenté la même version en Rest, .., j'ai tenté avec "text/plain" à la place de "application/json" (comme cela marche aussi via Curl ou postman) rien de rien. Si quelqu'un à une idée.. Merci d'avance Christian |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 351 messages |
|
| Posté le 27 novembre 2021 - 18:39 |
Bonjour Christian,
Avec la méthode GET (httpGet), les données à envoyer au serveur sont écrites directement dans l’URL et non dans le contenu.
Mets ton {"skus" : ["XXXXX"] } dans l'URL précédé d'un ? et ça devrait fonctionner (il est possible que tu aies besoin de URLEncode pour passer tes paramètres).
Si tu veux envoyer un contenu, il faut utiliser la méthode POST (httpPost) à la place de GET.
-- Bon développement, Patrick [3po.fr] |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 1 002 messages |
|
| Posté le 27 novembre 2021 - 19:02 |
bonjour,
et comme ca ?
MaReq est une httpRequête Lu est un Buffer MaReq.URL = "https://..../stockanddeliverymethods/get" MaReq.Méthode = httpGet MaReq.ContentType = "application/json"
MaReq.Contenu = [ {\"skus\":[\"XXXXX\"]} ] MaRep est un httpRéponse = HTTPEnvoie(MaReq) SI ErreurDétectée ALORS Erreur(ErreurInfo(errComplet)) SINON Info(MaRep.Contenu) FIN
Jordan |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 351 messages |
|
| Posté le 28 novembre 2021 - 08:05 |
Bonjour Jordan,
Toutes ces lignes de code sont identiques et font exactement la même chose
Lu est un Buffer Lu = "{""skus"":[""XXXXX""]}" MaReq.Contenu = Lu
Lu est un Buffer = "{""skus"":[""XXXXX""]}" MaReq.Contenu = Lu
MaReq.Contenu = "{""skus"":[""XXXXX""]}"
MaReq.Contenu = [ {\"skus\":[\"XXXXX\"]} ] La méthode GET ne doit pas contenir de "Contenu", les paramètres doivent être passés dans l'URL pour cette méthode (Voir RFC 2616).
C'est d'ailleurs un problème de sécurité d'utiliser GET avec des paramètres, car l'historique pourrait faire ressortir des données sensibles, de même pour proxy qui log les URL.
Évidemment si c'est pour demander la page 2 d'un site ... rien de bien grave, mais si dans le cas de Christian, "skus" est un numéro de série ou un code secret alors là on peut se poser la question. Bon j'imagine que son "skus" n'est autre qu'un "Stock Keeping Unit", en général un SKU correspond à un numéro de référence unique d'un produit.
-- Bon développement, Patrick [3po.fr] |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 351 messages |
|
| Posté le 29 novembre 2021 - 14:34 |
Il fallait lire :
MaReq.Contenu = [ {"skus":["XXXXX"]} ]
Je n'avais pas remarqué que Jordan avait ajouté des \ devant les ",
Les \ ne servent qu'à échapper le caractère suivant ... utile quand on a besoin d'une interprétation d'un caractère.
Jordan a ajouté des \" pour la commande Curl via un invité de commande ... les " étant un délimiteur de valeur sous dos, il est donc obligé de mettre \" pour l'échapper et donc faire comprendre au dos que c'est bien le caractère " et non le délimiteur.
Rappel : le caractère d'échappement du " chez PCSoft est le " soit "" pour éviter de le confondre avec le délimiteur d'une chaine.
-- Bon développement, Patrick [3po.fr] |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 93 messages |
|
| Posté le 30 novembre 2021 - 13:02 |
Bonjour, Merci pour les pistes hélas infructueuses. J'ai cependant une commande curl qui fonctionne (sous windows je précise)
curl --request GET --location "https://...../stockanddeliverymethods/get" --data-raw "{\"skus\":[\"XXXXX\"]}"
Reste à la traduire l'utilitaire wd_curl2WL de la LST 123 ne donnant rien ... |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 351 messages |
|
| Posté le 30 novembre 2021 - 14:15 |
Bonjour Christian,
Je viens de vérifier ce qu'envoyait Curl avec ce type de requête ... et effectivement les données {"skus":["XXXXX"]} sont envoyées dans l'équivalent de "Contenu" de la requête HTTP ... ce qui est incohérent avec la RFC du protocole HTTP !
En relisant d'ailleurs la documentation de la fonction HTTPRequête : https://doc.pcsoft.fr/fr-fr/?3043007 , il est bien indiqué :
Message à envoyer : Chaîne de caractères optionnelle. Message HTTP à envoyer au serveur. Ce paramètre peut être spécifié uniquement dans le cas d'une requête d'envoi de message (requête POST). Le message à envoyer doit respecter le protocole HTTP utilisé. Si ce paramètre est précisé et non vide, il s'agit d'une requête POST sinon c'est une requête GET (tout le reste est automatique). C'est donc la même chose pour HTTPEnvoie, en mode GET elle n'envoie pas le contenu ... donc cela ne peut pas fonctionner pour toi car tu es hors RFC.
Si tu veux que ta requête fonctionne en Windev, il te faudra le faire avec les sockets et envoyer ton entête + tes datas et tu auras la réponse attendue en retour.
Les données à envoyer doivent être ainsi (espace et retour chariot à respecter) :
GET /stockanddeliverymethods/get HTTP/1.1 Host: nomduhost.xxx User-Agent: mettre un user-agent ici Accept: */* Content-Length: 18 Content-Type: application/x-www-form-urlencoded
{"skus":["XXXXX"]}
Il suffit avant de se connecter sur le port du serveur HTTP ... je te laisse faire le code pour ça, rien de bien compliqué !
-- Bon développement, Patrick [3po.fr] |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 93 messages |
|
| Posté le 30 novembre 2021 - 18:20 |
Merci, effectivement j avais vu cette affectation automatique du type GET ou POST , ce qui est dommage pour by-passer la norme.
Sauf bétise de ma part, on va être sur un bout de code en simplifié
SI SocketConnecte("MaSocketHTTP", 443, "https://......", 5000) ALORS SocketChangeModeTransmission("MaSocketHTTP", SocketSansMarqueurFin) SI SocketEcrit("MaSocketHTTP", sMessage) ALORS Trace( SocketLit("MaSocketHTTP", Vrai) ) FIN FIN sMessage contenant le fameux message décrit . |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 93 messages |
|
| Posté le 30 novembre 2021 - 18:22 |
| (sinon, j ai encapsulé en appel curl dans un batch qui génère un fichier que je relis avec fchargebuffer et travaille en lecture json via un variant. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 351 messages |
|
| Posté le 01 décembre 2021 - 12:01 |
Bonjour,
By-passer une norme n'est pas une bonne chose ... sinon à quoi servirait-elle ?
Quand tu te connectes à un serveur via les sockets, il ne faut pas préciser le protocole mais l'adresse IP ou le nom du domaine (avec éventuellement les sous-domaines selon ton URL de départ). Tu es en HTTPS .. il te faut donc utiliser SocketConnecteSSL et il vaut mieux utiliser "5 s" au lieu des 5000 ... c'est plus parlant.
SocketConnecteSSL("MaSocketHTTP",443,"3po.fr",ProtocoleTLS1_2 + ProtocoleTLS1_1,5 s) (Il est bien dommage que le protocole TLS 1.3 ne soit pas pris en charge ... pourtant il est bien normé maintenant !)
Encapsuler une autre application comporte des risques ... lorsqu'elle évolue, tu dois faire évoluer ton application avec et tu as toujours le risque de ne pas avoir traité un cas. Et ça devient vite une usine à gaz de lancer un batch qui récupère des données certainement dans un fichier car je pense que tu ne pilotes pas le StdOut ni le StdErr. En bref je ne le recommande que dans des cas extrêmes.
Il est relativement simple de faire la même chose que Curl surtout dans ce cas précis.
-- Bon développement, Patrick [3po.fr] |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 50 messages |
|
| Posté le 05 septembre 2024 - 12:05 |
Bonjour,
Je dois effectuer une recherche sur un cluster ElasticSearch, et le fonctionnement est un appel en GET avec de la donnée en POST (la requête). C'est même de cette manière que ça fonctionne. (Tant pis pour la norme ...)
Avec un logiciel type Postman , je n'ai aucun soucis. Mais je n'arrive pas a retranscrire cet appel en Windev ... C'est quand même dommage qu'on ne puisse pas forcer avec les méthodes classiques HTTPEnvoie ou HTTPRequête.
-- La chute n'est pas un échec. L'échec c'est de rester là où on est tombé. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 50 messages |
|
| Posté le 06 septembre 2024 - 15:05 |
Bon j'ai trouvé ... C'est bizarre quand même mais avec en mettant requete..Méthode = httpPost
ça passe !
-- La chute n'est pas un échec. L'échec c'est de rester là où on est tombé. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 682 messages |
|
| Posté le 06 septembre 2024 - 18:01 |
Bonjour,
Je dois effectuer une recherche sur un cluster ElasticSearch, et le fonctionnement est un appel en GET avec de la donnée en POST (la requête). C'est même de cette manière que ça fonctionne. (Tant pis pour la norme ...)
Avec un logiciel type Postman , je n'ai aucun soucis. Mais je n'arrive pas a retranscrire cet appel en Windev ... C'est quand même dommage qu'on ne puisse pas forcer avec les méthodes classiques HTTPEnvoie ou HTTPRequête.
-- La chute n'est pas un échec. L'échec c'est de rester là où on est tombé.
Quand on a une question, on ouvre un nouveau post plutôt que d'en utiliser un vieux de 3 ans...
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|