Simple POST/GET HttpRequest avec mql4

 

Bonjour à tous,

Je sais que ce sujet a été discuté de nombreuses fois. Mais tous les articles que j'ai trouvés sur ce sujet étaient malheureusement trop compliqués ou produisaient des messages d'erreur car ils sont trop vieux. Par conséquent, je n'ai pas été en mesure de créer un script qui fait une simple requête POST/GET.

Donc, je veux simplement envoyer une requête POST et GET à un serveur. Le fichier cible est un simple fichier php.

Voici le premier testcript que j'ai produit et qui est basé sur https://www.mql5.com/en/code :

#import  "Wininet.dll"
   int InternetOpenA(string, int, string, string, int);
   int InternetConnectA(int, string, int, string, string, int, int, int); 
   int InternetOpenUrlA(int, string, string, int, int, int);
   int InternetReadFile(int, string, int, int& OneInt[]);
   int InternetCloseHandle(int); 
   int HttpOpenRequestA(int, string, string, string, string, string& AcceptTypes[], int, int);
   bool HttpSendRequestA(int, string, int, string, int);
#import
 

int OnInit()
{
   string headers = "Content-Type: application/x-www-form-urlencoded";
   string data = "";
   string acceptTypes[1] = {"*/*"};

   int HttpOpen = InternetOpenA("HTTP_Client_Sample", 1, NULL, NULL, 0); 
   int HttpConnect = InternetConnectA(HttpOpen, "http://localhost/tradex", 7777, NULL, NULL, 3, 0, 1);
   int HttpRequest = HttpOpenRequestA(HttpConnect, "POST", "/index.php", "HTTP/1.1", NULL, acceptTypes, 0, 1);
   string result = HttpSendRequestA(HttpRequest, headers, StringLen(headers), data, StringLen(data));

   int read[1];
   Print("This is the POST result: " + result);

   return(0);
}

Malheureusement, je reçois comme résultat "0", ce qui signifie que la requête n'a pas abouti. Mais je n'arrive pas à savoir pourquoi.

J'espère que vous pourrez m'aider.

Merci,

Alex

 

D'après la nature du problème que vous décrivez, je suppose que vous utilisez le B600 >.

vous devez donc adapter votre code en utilisant UNICODE par exemple

int InternetOpenW(...

et non (ANSI)

int InternetOpenA(...
 
coolex:

Bonjour à tous,

Je sais que ce sujet a été discuté de nombreuses fois. Mais tous les articles que j'ai trouvés sur ce sujet étaient malheureusement trop compliqués ou produisaient des messages d'erreur car ils sont trop vieux. Par conséquent, je n'ai pas été en mesure de créer un script qui fait une simple requête POST/GET.

Donc, je veux simplement envoyer une requête POST et GET à un serveur. Le fichier cible est un simple fichier php.

Voici le premier testcript que j'ai produit et qui est basé sur https://www.mql5.com/en/code :

Malheureusement, je reçois comme résultat "0", ce qui signifie que la requête n'a pas abouti. Mais je n'arrive pas à savoir pourquoi.

J'espère que vous pourrez m'aider.

Merci,

Alex


https://www.mql5.com/en/forum/149321
 

OK. Merci pour cette réponse rapide. Je ne l'ai pas encore testé mais pourriez-vous me donner plus de détails ? Désolé de demander ça, mais qu'est-ce que le B600 ? De plus, je ne trouve pas de documentation pour les fonctions "InternetOpenW" ou "InternetOpenA" sur http://msdn.microsoft.com/en-us/libr ary/windows/desktop/aa385098(v=vs.85).aspx.

D'où viennent les fonctions "...A" et "...W" ?

Merci de votre aide.

 
coolex:

mais qu'est-ce que le B600 ?

version 600 et plus (MetaTrader) = build 600 et plus = B600 >

coolex:

D'où viennent les "...A" et "...W" ?

J'espère que vous pouvez lire

dans la même page dans le lien que vous avez fourni dit(en bas) :

Noms Unicode et ANSI InternetOpenUrlW (Unicode) et InternetOpenUrlA (ANSI)

 
OK, je n'ai pas trouvé les fonctions "InternetOpenW" ou "InternetOpenA" sur le site http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx car elles n'y existent pas mais "InternetOpenUrlW" et "InternetOpenUrlA" existent bien sûr.
C'est pourquoi je demandais "...W" et "...A" et la lecture n'est pas le problème :-).

La fonction principale est "HttpOpenRequest" parce qu'avec son aide je peux envoyer des requêtes POST et GET à une URL. Voici la documentation : http://msdn.microsoft.com/en-us/library/windows/desktop/aa384233(v=vs.85).aspx
Mais je ne sais pas si je dois utiliser "HttpOpenRequestA" ou "HttpOpenRequestW" car lorsque j'utilise "HttpOpenRequestW", je reçois le message d'erreur suivant : "Access violation read to 0x0000007B in 'Wininet.dll'". En utilisant "HttpOpenRequestA", j'ai toujours le même problème qu'au début.

Donc, en fait, je pense que pour les requêtes POST/GET, je n'ai pas du tout besoin de la fonction "InternetOpenUrlW".

Voici le code actuel qui ne fonctionne toujours pas :-( :

#import  "Wininet.dll"
   int  InternetOpenW(string, int, string, string, int);
   int  InternetConnectW(int, string, int, string, string, int, int, int); 
   int  InternetOpenUrlW(int, string, string, int, int, int);
   int  InternetCloseHandle(int); 
   int  HttpOpenRequestA (int, string, string, string, string, string& AcceptTypes[], int, int);
   bool HttpSendRequestW(int, string, int, string, int);
#import
 

int OnInit()
{
   string headers = "Content-Type: application/x-www-form-urlencoded";
   string data = "";
   string acceptTypes[1] = {"*/*"};

   int HttpOpen = InternetOpenW("HTTP_Client_Sample", 1, NULL, NULL, 0);  
   int HttpConnect = InternetConnectW(HttpOpen, "http://localhost/tradex", 7777, NULL, NULL, 3, 0, 1);
   int HttpRequest = HttpOpenRequestA(HttpConnect, "POST", "/index.php", "HTTP/1.1", NULL, acceptTypes, 0, 1);
   string result = HttpSendRequestW(HttpRequest, headers, StringLen(headers), data, StringLen(data));

   int read[1];
   Print("This is the POST result: " + result);

   return(0);
}
 

J'ai écrit plus haut que vous devez adapter votre code pour UNICODE et je vous ai donné un seul exemple et vous avez encore des choses à adapter pour

 int  HttpOpenRequestA (int, string, string, string, string, string& AcceptTypes[], int, int);

et je te dis d'avance que ce n'est pas tout, il y en a plus

 

Salut qjol,

dans mon message précédent, j'ai écrit que la transformation de "HttpOpenRequestA" en "HttpOpenRequestW" provoque l'erreur "Access violation read to 0x0000007B in 'Wininet.dll'".

J'ai déjà modifié toutes les autres fonctions en UNICODE.

Je suis désolé si j'ai mal compris, mais qu'est-ce qui manque ou ne va pas pour une simple demande POST/GET ?

 
Jetez un coup d'œil ici
 

Bonjour qjol,

merci pour le lien qui est très utile. Je peux voir que pour GET des données à partir d'une URL semble fonctionner mais je ne sais toujours pas comment POST des données. Votre script définit la fonction "HttpOpenRequestW" mais ne l'utilise pas. De plus, le script ne récupère que les données, ce qui fonctionne très bien.

Mais comment puis-je POSTer des données ? Cela devrait fonctionner avec "HttpOpenRequestW" mais comme je l'ai déjà posté auparavant, je reçois le message d'erreur : "Access violation read to 0x0000007B in 'Wininet.dll' " et "HttpOpenRequestA " ne fonctionne évidemment pas.

J'espère que vous pourrez m'aider.


 

J'ai décidé de vérifier votre code et je l'ai corrigé mais comme le résultat = faux, j'ai vérifié et j'obtiens le code d'erreur 12005 et selon la liste des codes d'erreur de Microsoft, cela signifie

ERROR_INTERNET_INVALID_URL

12005

L'URL n'est pas valide.


  #import  "Wininet.dll"
   int InternetOpenW(string, int, string, string, int);
   int InternetConnectW(int, string, int, string, string, int, int, int); 
   int InternetOpenUrlW(int, string, string, int, int, int);
   int InternetReadFile(int, string, int, int& OneInt[]);
   int InternetCloseHandle(int); 
   int HttpOpenRequestW(int, string, string, string, string, string& AcceptTypes[], int, int);
   bool HttpSendRequestW(int, string, int, string, int);
#import
#import "kernel32.dll"
int GetLastError(void);
#import

   string headers = "Content-Type: application/x-www-form-urlencoded";
   string data = "";
   string acceptTypes[1] = {"*/*"};

   int HttpOpen = InternetOpenW("HTTP_Client_Sample", 1, "", "", 0);  
   int HttpConnect = InternetConnectW(HttpOpen, "http://localhost/tradex", 7777, "", "", 3, 0, 1);
   int HttpRequest = HttpOpenRequestW(HttpConnect, "POST", "/index.php", "HTTP/1.1", "", acceptTypes, 0, 1);
   bool result = HttpSendRequestW(HttpRequest, headers, StringLen(headers), data, StringLen(data));
   Alert ("Last MSDN Error =: ", kernel32::GetLastError());
   
   int read[1]; // not used
   Print("This is the POST result: ", result);
   if (HttpOpen > 0)
   InternetCloseHandle(HttpOpen);
   if (HttpRequest > 0)
   InternetCloseHandle(HttpRequest);
   
   return;