Semplice POST/GET HttpRequest con mql4

 

Ciao a tutti,

So che questo argomento è stato discusso molte volte. Ma tutti gli articoli che ho trovato su questo argomento erano purtroppo troppo complicati o producevano messaggi di errore perché erano troppo vecchi. Pertanto non sono stato in grado di creare uno script che faccia una semplice richiesta POST/GET.

Quindi, voglio semplicemente inviare una richiesta POST e GET a un server. Il file di destinazione è un semplice file php.

Questo è il mio primo testcript che ho prodotto e che è basato su 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);
}

Purtroppo ricevo come risultato "0" che significa che la richiesta non ha avuto successo. Ma non riesco a capire perché.

Spero che tu possa aiutarmi.

Grazie,

Alex

 

dalla natura del problema che state descrivendo immagino che usiate B600 >

quindi dovete adattare il vostro codice usando UNICODE per esempio

int InternetOpenW(...

e non (ANSI)

int InternetOpenA(...
 
coolex:

Ciao a tutti,

So che questo argomento è stato discusso molte volte. Ma tutti gli articoli che ho trovato su questo argomento erano purtroppo troppo complicati o producevano messaggi di errore perché erano troppo vecchi. Pertanto non sono stato in grado di creare uno script che faccia una semplice richiesta POST/GET.

Quindi, voglio semplicemente inviare una richiesta POST e GET a un server. Il file di destinazione è un semplice file php.

Questo è il mio primo testcript che ho prodotto e che è basato su https://www.mql5.com/en/code:

Purtroppo ricevo come risultato "0" che significa che la richiesta non ha avuto successo. Ma non riesco a capire perché.

Spero che tu possa aiutarmi.

Grazie,

Alex


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

OK. Grazie per la risposta veloce. Non l'ho ancora testato, ma potresti dare qualche dettaglio in più? Scusa se te lo chiedo, ma cos'è B600? Inoltre non riesco a trovare la documentazione per le funzioni "InternetOpenW" o "InternetOpenA" su http://msdn.microsoft.com/en-u s/library/windows/desktop/aa385098(v=vs.85).aspx

Da dove viene il "...A" e "...W"?

Grazie per l'aiuto.

 
coolex:

ma cos'è B600?

versione 600 e oltre (MetaTrader) = build 600 e oltre = B600 >

coolex:

Da dove viene il "...A" e "...W"?

Spero che tu possa leggere

nella stessa pagina nel link che hai fornito dice(in fondo):

Nomi Unicode e ANSI InternetOpenUrlW (Unicode) e InternetOpenUrlA (ANSI)

 
OK, non sono riuscito a trovare le funzioni "InternetOpenW" o "InternetOpenA" sul sito http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx perché non esistono lì ma "InternetOpenUrlW" e "InternetOpenUrlA" esistono ovviamente.
Ecco perché chiedevo "...W" e "...A" e la lettura non è il problema :-).

La funzione principale è "HttpOpenRequest" perché con il suo aiuto posso inviare richieste POST e GET a un URL. Ecco il documento: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384233(v=vs.85).aspx
Ma non so se devo usare "HttpOpenRequestA" o "HttpOpenRequestW" perché quando uso "HttpOpenRequestW" ricevo il messaggio di errore: "Access violation read to 0x0000007B in 'Wininet.dll'". Usando "HttpOpenRequestA" ho ancora lo stesso problema dell'inizio.

Quindi, in realtà penso che per le richieste POST/GET non ho affatto bisogno della funzione "InternetOpenUrlW".

Questo è il codice attuale che ancora non funziona :-( :

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

Ho scritto sopra che avete bisogno di adattare il vostro codice per UNICODE e vi ho dato solo un esempio e avete ancora lasciato delle cose che dovete adattare per

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

e ti dico in anticipo che non è tutto, c'è di più

 

Ciao qjol,

nel mio post precedente ho scritto che cambiare "HttpOpenRequestA" in "HttpOpenRequestW" causa l'errore "Access violation read to 0x0000007B in 'Wininet.dll'".

Tutte le altre funzioni le ho già cambiate in UNICODE.

Mi dispiace se ho capito male, ma cos'altro manca o è sbagliato per una semplice richiesta POST/GET?

 
dai un'occhiata qui
 

Ciao qjol,

grazie per il link che è molto utile. Vedo che GET dati da un URL sembra funzionare ma non so ancora come POST dati. Il tuo script definisce la funzione "HttpOpenRequestW" ma non la usa. Inoltre lo script recupera solo i dati, il che funziona alla grande.

Ma ancora come posso POSTare i dati? Dovrebbe funzionare con "HttpOpenRequestW" ma come ho già postato prima ottengo il messaggio di errore: "Access violation read to 0x0000007B in 'Wininet.dll'" e "HttpOpenRequestA" ovviamente non funziona.

Spero possiate aiutarmi.


 

Ho deciso di controllare il tuo codice e l'ho aggiustato ma dato che risultato = falso, ho controllato e sto ottenendo il codice di errore 12005 e secondo la lista dei codici di errore di microsoft significa

ERRORE_INTERNET_INVALIDO_URL

12005

L'URL non è valido.


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