Simple POST/GET HttpRequest con mql4

 

Hola a todos,

Sé que este tema se ha discutido muchas veces. Pero todos los artículos que he encontrado sobre este tema eran, por desgracia, demasiado complicados o producen un mensaje de error porque son demasiado antiguos. Por lo tanto, no he podido crear un script que haga una simple petición POST/GET.

Así que, simplemente quiero enviar una petición POST y GET a un servidor. El archivo de destino es un simple archivo php.

Este es mi primer testcript que produje y que está basado en 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);
}

Desgraciadamente recibo como resultado "0" lo que significa que la petición no tuvo éxito. Pero no puedo encontrar la razón.

Espero que me puedan ayudar.

Gracias,

Alex

 

por la naturaleza del problema que describes supongo que utilizas B600 >

porlo que tienes que adaptar tu código usando UNICODE por ejemplo

int InternetOpenW(...

y no (ANSI)

int InternetOpenA(...
 
coolex:

Hola a todos,

Sé que este tema se ha discutido muchas veces. Pero todos los artículos que he encontrado sobre este tema eran, por desgracia, demasiado complicados o producen un mensaje de error porque son demasiado antiguos. Por lo tanto, no he podido crear un script que haga una simple petición POST/GET.

Así que, simplemente quiero enviar una petición POST y GET a un servidor. El archivo de destino es un simple archivo php.

Este es mi primer testcript que produje y que está basado en https://www.mql5.com/en/code:

Desgraciadamente recibo como resultado "0" lo que significa que la petición no tuvo éxito. Pero no puedo encontrar la razón.

Espero que me puedan ayudar.

Gracias,

Alex


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

DE ACUERDO. Gracias por la rápida respuesta. Todavía no lo he probado, pero ¿podría dar más detalles? Perdona que te pregunte, pero ¿qué es B600? Además, no encuentro documentación para las funciones "InternetOpenW" o "InternetOpenA" en http://msdn.microsoft.com/en -us/library/windows/desktop/aa385098(v=vs.85).aspx

¿De dónde salen las funciones "...A" y "...W"?

Gracias por la ayuda.

 
coolex:

¿pero qué es B600?

versión 600 y superior (MetaTrader) = build 600 y superior = B600 >

coolex:

¿De dónde viene la "...A" y la "...W"?

espero que puedas leer

en la misma página en el enlace que has proporcionado dice(al final):

Nombres Unicode y ANSI InternetOpenUrlW (Unicode) e InternetOpenUrlA (ANSI)

 
OK, no pude encontrar las funciones "InternetOpenW" o "InternetOpenA" en el sitio http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx porque no existen allí pero "InternetOpenUrlW" e "InternetOpenUrlA" existen por supuesto.
Por eso preguntaba por "...W" y "...A" y la lectura no es el problema :-).

La función principal es "HttpOpenRequest" porque con su ayuda puedo enviar peticiones POST y GET a una URL. Aquí está el documento: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384233(v=vs.85).aspx
Pero no sé si debo usar "HttpOpenRequestA" o "HttpOpenRequestW" porque cuando uso "HttpOpenRequestW" recibo el mensaje de error: "Access violation read to 0x0000007B in 'Wininet.dll'". Usando "HttpOpenRequestA" sigo teniendo el mismo problema que al principio.

Así que, en realidad, creo que para las peticiones POST/GET no necesito la función "InternetOpenUrlW" en absoluto.

Este es el código actual que sigue sin funcionar :-( :

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

escribí arriba que necesitas adaptar tu código para UNICODE y te di sólo un ejemplo y todavía dejaste cosas que necesitas adaptar para

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

y te adelanto que no es todo, hay más

 

Hola qjol,

en mi post anterior escribí que cambiar "HttpOpenRequestA" por "HttpOpenRequestW" provoca el error "Access violation read to 0x0000007B in 'Wininet.dll'".

Todas las demás funciones ya las he cambiado a UNICODE.

Lo siento si lo he entendido mal, pero ¿qué más falta o está mal para una simple petición POST/GET?

 
eche un vistazo aquí
 

Hola qjol,

gracias por el enlace que es muy útil. Veo que para GET datos de una URL parece que funciona pero sigo sin saber como POST datos. Tu script define la función "HttpOpenRequestW" pero no la utiliza. Además, el script sólo recupera datos, lo que funciona muy bien.

Pero aún así, ¿cómo puedo enviar datos por correo? Debería funcionar con "HttpOpenRequestW" pero como ya he posteado antes me sale el mensaje de error: "Access violation read to 0x0000007B in 'Wininet.dll'" y "HttpOpenRequestA" obviamente no funciona.

Espero que me puedan ayudar.


 

Decidí comprobar tu código y lo arreglé pero como el resultado = falso, lo comprobé y estoy recibiendo el código de error 12005 y según la lista de códigos de error de microsoft significa

ERROR_INTERNET_INVALID_URL

12005

La URL no es válida.


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