Nouvel article Utiliser WinInet dans MQL5. Part 2 : POST Requests and Files a été publié :
Auteur : Alex Sergeev
Bonjour Alex,
Bon article - j'ai une demande pour la 'Partie 3' : Communication client XML-RPC (et serveur si possible).
Cordialement
Lors de l'exécution de l' instruction suivante, le système se bloque, comment résoudre ce problème?
hConnect=InternetConnectW(hSession, aHost, aPort, aUser, aPass, aService, 0, 0) ;
Error: Access violation read to 0x0000000000001F94 in '......ex5' (Erreur: Violation d'accès en lecture à 0x0000000000001F94 dans '......ex5')
Il y a un petit bug à la ligne 161. Cette ligne devrait être :
else StringToCharArray(req.stData, data, 0, StringLen(req.stData));
c'est parce que le terminal 0 est copié dans le tableau et que HttpSendRequestW envoie le terminal 0 (comme un caractère supplémentaire) à la dernière valeur de post var. Par exemple, si vos données sont :
var1=value1&var2=value2
Vous obtiendrez dans votre page web var1 associé à value1, et var2 associé à value2\0.
C'est un excellent article. Merci de l'avoir partagé.
Merci d'avoir partagé cet article.
L'erreur de violation d'accès a été résolue mais les requêtes POST ne fonctionnent plus. Apparemment, les données contenues dans un tableau uchar ne sont pas correctement envoyées à la fonction dll.
Pourquoi personne ne se préoccupe de ce problème ?
J'ai également rencontré une erreur de violation d'accès avec cette classe d'objets. Le problème venait de l'utilisation de '0' comme pointeur NULL dans l'appel de la fonction HttpOpenRequestW. Essayez de remplacer l'appel
--- hRequest=HttpOpenRequestW(hConnect, req.stVerb, req.stObject, Vers, nill, 0, INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE, 0);
par un appel :
+++ hRequest=HttpOpenRequestW(hConnect, req.stVerb, req.stObject, Vers, NULL, NULL , INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE, 0);
Il est amusant de constater que l'utilisation incorrecte d'un pointeur NULL est même explicitement mentionnée comme une raison de plantage dans la documentation MSDN:
Failing to properly terminate the array with a NULL pointer will cause a crash.
- msdn.microsoft.com
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Un nouvel article Utilisation de WinInet dans MQL5. Partie 2 : Requêtes et fichiers POST a été publié :
Dans cet article, nous continuons à étudier les principes du travail avec Internet en utilisant les requêtes HTTP et l'échange d'informations avec le serveur. Il décrit les nouvelles fonctions de la classe CMqlNet, les méthodes d'envoi d'informations à partir de formulaires et l'envoi de fichiers à l'aide de requêtes POST ainsi que l'autorisation sur les sites web sous votre identifiant à l'aide de cookies.
En fait, les requêtes POST ne sont pas analogues aux requêtes GET (sinon elles ne seraient pas nécessaires). Les requêtes POST présentent un avantage considérable - elles permettent d'envoyer des fichiers au contenu binaire.
Il s'agit d'une requête du type urlencoded qui est autorisée à envoyer un ensemble limité de symboles. Sinon, les symboles « non autorisés » seront remplacés par des codes. Ainsi lors de l'envoi de données binaires, elles seront déformées. Vous n'êtes donc pas en mesure d'envoyer même un petit fichier gif à l'aide d'une requête GET.
Pour résoudre ce problème, des règles spéciales de description d'une requête sont élaborées ; elles permettent d'échanger des fichiers binaires en plus des fichiers texte.
Pour atteindre cet objectif, le corps de la demande est divisé en sections. L'essentiel est que chaque section puisse avoir son propre type de données. Par exemple, le premier est un texte, le suivant est une image/jpeg, etc. En d'autres termes, une requête envoyée au serveur peut contenir plusieurs types de données à la fois.
Voyons la structure d'une telle description à l'aide de l'exemple des données transmises par le script MetaSwap.
L'en-tête de la requête Tête sera le suivant :
Type de contenu : multipart/form-data ; limite=SEPARATOR\r\n
Auteur : ---