Einfache POST/GET HttpRequest mit mql4

 

Hallo zusammen,

ich weiß, dass dieses Thema schon oft diskutiert wurde. Aber alle Artikel, die ich zu diesem Thema gefunden habe, waren leider zu kompliziert oder produzieren Fehlermeldungen, weil sie zu alt sind. Daher war ich nicht in der Lage, ein Skript zu erstellen, das eine einfache POST/GET-Anfrage ausführt.

Ich möchte also einfach POST- und GET-Anfragen an einen Server senden. Die Zieldatei ist eine einfache php-Datei.

Dies ist mein erstes Testskript, das ich erstellt habe und das auf https://www.mql5.com/en/code basiert:

#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);
}

Leider erhalte ich als Ergebnis "0", was bedeutet, dass die Anfrage nicht erfolgreich war. Aber ich kann nicht herausfinden, warum.

Hoffentlich können Sie mir helfen.

Vielen Dank!

Alex

 

Aufgrund der Art des von Ihnen beschriebenen Problems gehe ich davon aus, dass Sie B600 verwenden >

also müssen Sie Ihren Code anpassen, indem Sie zum Beispiel UNICODE verwenden

int InternetOpenW(...

und nicht (ANSI)

int InternetOpenA(...
 
coolex:

Hallo zusammen,

ich weiß, dass dieses Thema schon oft diskutiert wurde. Aber alle Artikel, die ich zu diesem Thema gefunden habe, waren leider zu kompliziert oder produzieren Fehlermeldungen, weil sie zu alt sind. Daher war ich nicht in der Lage, ein Skript zu erstellen, das eine einfache POST/GET-Anfrage ausführt.

Ich möchte also einfach POST- und GET-Anfragen an einen Server senden. Die Zieldatei ist eine einfache php-Datei.

Dies ist mein erstes Testskript, das ich erstellt habe und das auf https://www.mql5.com/en/code basiert:

Leider erhalte ich als Ergebnis "0", was bedeutet, dass die Anfrage nicht erfolgreich war. Aber ich kann nicht herausfinden, warum.

Hoffentlich können Sie mir helfen.

Vielen Dank!

Alex


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

GUT. Danke für die schnelle Antwort. Ich habe es noch nicht getestet, aber könnten Sie mir bitte ein paar mehr Details geben? Entschuldigung für die Frage, aber was ist B600? Außerdem kann ich keine Dokumentation für die Funktionen "InternetOpenW" oder "InternetOpenA" auf http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx finden.

Woher kommt das "...A" und "...W"?

Vielen Dank für Ihre Hilfe.

 
coolex:

aber was ist B600?

Version 600 und höher (MetaTrader) = Build 600 und höher = B600 >

coolex:

Woher kommt das "...A" und "...W"?

Ich hoffe, Sie können lesen

auf der gleichen Seite in dem von Ihnen angegebenen Link steht(ganz unten):

Unicode- und ANSI-Namen InternetOpenUrlW (Unicode) und InternetOpenUrlA (ANSI)

 
OK, ich konnte die Funktionen "InternetOpenW" oder "InternetOpenA" auf der Seite http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx nicht finden, weil sie dort nicht existieren, aber "InternetOpenUrlW" und "InternetOpenUrlA" existieren natürlich.
Deshalb habe ich nach "...W" und "...A" gefragt und das Lesen ist nicht das Problem :-).

Die Kernfunktion ist "HttpOpenRequest", weil ich mit ihrer Hilfe POST und GET Anfragen an eine URL senden kann. Hier ist die Doku: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384233(v=vs.85).aspx
Aber ich weiß nicht, ob ich "HttpOpenRequestA" oder "HttpOpenRequestW" verwenden soll, denn wenn ich "HttpOpenRequestW" verwende, erhalte ich die Fehlermeldung: "Access violation read to 0x0000007B in 'Wininet.dll'". Wenn ich "HttpOpenRequestA" verwende, habe ich immer noch das gleiche Problem wie am Anfang.

Ich denke also, dass ich für POST/GET-Anfragen die Funktion "InternetOpenUrlW" gar nicht benötige.

Dies ist der aktuelle Code, der immer noch nicht funktioniert :-( :

#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);
}
 

Ich habe oben geschrieben, dass Sie Ihren Code für UNICODE anpassen müssen, und ich habe Ihnen nur ein Beispiel gegeben, und Sie haben noch Dinge übrig, die Sie anpassen müssen

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

und ich sage dir im Voraus, dass das nicht alles ist, es gibt noch mehr

 

Hallo qjol,

in meinem vorherigen Beitrag habe ich geschrieben, dass die Änderung von "HttpOpenRequestA" in "HttpOpenRequestW" den Fehler "Access violation read to 0x0000007B in 'Wininet.dll'" verursacht .

Alle anderen Funktionen habe ich bereits auf UNICODE umgestellt.

Es tut mir leid, wenn ich etwas falsch verstanden habe, aber was fehlt noch oder ist falsch für eine einfache POST/GET-Anfrage?

 
Sehen Sie hier nach
 

Hallo qjol,

danke für den Link, der sehr hilfreich ist. Ich kann sehen, dass GET-Daten von einer URL zu funktionieren scheint, aber ich weiß immer noch nicht, wie man POST-Daten. Dein Skript definiert die Funktion "HttpOpenRequestW", benutzt sie aber nicht. Außerdem empfängt das Skript nur Daten, was auch gut funktioniert.

Aber wie kann ich trotzdem Daten POSTen? Es sollte mit "HttpOpenRequestW" funktionieren, aber wie ich schon vorher gepostet habe, bekomme ich die Fehlermeldung: "Zugriffsverletzung beim Lesen von 0x0000007B in 'Wininet.dll'" und "HttpOpenRequestA" funktioniert offensichtlich nicht.

Ich hoffe, Sie können helfen.


 

Ich habe mich entschlossen, Ihren Code zu überprüfen und habe ihn korrigiert, aber da das Ergebnis = falsch ist, habe ich ihn überprüft und erhalte den Fehlercode 12005, der laut Microsofts Fehlercodeliste bedeutet

FEHLER_INTERNET_UNGÜLTIGE_URL

12005

Die URL ist ungültig.


  #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;