Simples POST/GET HttpRequest com mql4

 

Olá a todos,

Eu sei que este tópico foi discutido muitas vezes. Mas todos os artigos que encontrei sobre esse tópico foram infelizmente muito complicados ou produziram mensagens de erro porque são muito antigos. Portanto, não fui capaz de criar um roteiro que fizesse um simples pedido POST/GET.

Portanto, eu simplesmente quero enviar um pedido de POST e GET para um servidor. O arquivo alvo é um simples arquivo php.

Este é o meu primeiro script de teste que produzi e que se baseia em 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);
}

Infelizmente recebo como resultado "0", o que significa que o pedido não foi bem sucedido. Mas não consigo descobrir o porquê.

Espero que você possa me ajudar.

Obrigado,

Alex

 

pela natureza do problema que você está descrevendo estou supondo que você usa B600 >

por isso você tem que adaptar seu código usando UNICODE, por exemplo

int InternetOpenW(...

e não (ANSI)

int InternetOpenA(...
 
coolex:

Olá a todos,

Eu sei que este tópico foi discutido muitas vezes. Mas todos os artigos que encontrei sobre esse tópico foram infelizmente muito complicados ou produziram mensagens de erro porque são muito antigos. Portanto, não fui capaz de criar um roteiro que fizesse um simples pedido POST/GET.

Portanto, eu simplesmente quero enviar um pedido de POST e GET para um servidor. O arquivo alvo é um simples arquivo php.

Este é o meu primeiro script de teste que produzi e que se baseia em https://www.mql5.com/en/code:

Infelizmente, recebo como resultado "0", o que significa que o pedido não foi bem sucedido. Mas não consigo descobrir o porquê.

Espero que você possa me ajudar.

Obrigado,

Alex


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

OK. Obrigado pela resposta rápida. Ainda não a testamos, mas você poderia dar mais detalhes? Desculpe por perguntar, mas o que é B600? Além disso, não consigo encontrar documentação para as funções "InternetOpenW" ou "InternetOpenA" em http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx

De onde vêm os "...A" e "...W"?

Obrigado por ajudar.

 
coolex:

mas o que é B600?

versão 600 e acima (MetaTrader) = construir 600 e acima = B600 >

coolex:

De onde vêm os "...A" e "...W"?

espero que você possa ler

na mesma página no link que você forneceu diz(na parte inferior):

Unicode e ANSI nomeia InternetOpenUrlW (Unicode) e InternetOpenUrlA (ANSI)

 
OK, não consegui encontrar as funções "InternetOpenW" ou "InternetOpenA" no site http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx porque elas não existem lá, mas "InternetOpenUrlW" e "InternetOpenUrlA" existem, é claro.
É por isso que eu estava pedindo "...W" e "...A" e a leitura não é o problema :-).

A função central é "HttpOpenRequest" porque com ela posso enviar um pedido POST e GET para uma URL. Aqui está o documento: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384233(v=vs.85).aspx
Mas não sei se devo usar "HttpOpenRequestA" ou "HttpOpenRequestW" porque quando uso "HttpOpenRequestW" recebo a mensagem de erro: "Access violation read to 0x0000007B in 'Wininet.dll'". Usando "HttpOpenRequestA" eu ainda tenho o mesmo problema que no início.

Portanto, na verdade eu acho que para o pedido POST/GET não preciso da função "InternetOpenUrlW" de forma alguma.

Este é o código atual que ainda não está funcionando :-( :

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

escrevi acima que você precisa adaptar seu código para UNICODE e dei apenas um exemplo e você ainda deixou coisas que você precisa adaptar para

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

e estou lhe dizendo com antecedência que não é tudo, há mais

 

Olá qjol,

em meu post anterior escrevi que a mudança de "HttpOpenRequestA" para "HttpOpenRequestW" causa o erro "Access violation read to 0x0000007B in 'Wininet.dll'".

Todas as outras funções eu já mudei para UNICODE.

Sinto muito se entendi mal, mas o que mais está faltando ou está errado para um simples pedido POST/GET?

 
dê uma olhada aqui
 

Olá qjol,

obrigado pela ligação, que é muito útil. Posso ver que para GET dados de uma URL parece funcionar, mas ainda não sei como POSTar dados. Seu script define a função "HttpOpenRequestW", mas não a utiliza. Além disso, o script só recupera dados que estão funcionando muito bem.

Mas ainda assim, como eu posso POSTar dados? Deve funcionar com "HttpOpenRequestW", mas como eu já postei antes de receber a mensagem de erro: "Violação de acesso lida em 0x0000007B em 'Wininet.dll'" e "HttpOpenRequestA" obviamente não está funcionando.

Espero que você possa ajudar.


 

decidi verificar seu código e corrigi-o, mas como resultado = falso, verifiquei-o e estou recebendo o código de erro 12005 e de acordo com a lista de códigos de erro da Microsoft isso significa

ERROR_INTERNET_INVALID_URL

12005

A URL é invá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;