Простой POST/GET HttpRequest с помощью mql4

 

Привет всем,

Я знаю, что эта тема обсуждалась много раз. Но все статьи, которые я нашел на эту тему, к сожалению, были слишком сложными или выдавали сообщение об ошибке, потому что они слишком старые. Поэтому я не смог создать скрипт, который выполняет простой POST/GET запрос.

Итак, я просто хочу отправить POST и GET запросы на сервер. Целевой файл - это простой php-файл.

Это мой первый тестовый скрипт, который я создал на основе 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);
}

К сожалению, я получаю в качестве результата "0", что означает, что запрос не был успешным. Но я не могу выяснить причину.

Надеюсь, вы сможете мне помочь.

Спасибо,

Алекс

 

судя по характеру описанной вами проблемы, я предполагаю, что вы используете B600 >

поэтому вы должны адаптировать свой код, используя, например, UNICODE

int InternetOpenW(...

а не (ANSI)

int InternetOpenA(...
 
coolex:

Привет всем,

Я знаю, что эта тема обсуждалась много раз. Но все статьи, которые я нашел на эту тему, к сожалению, были слишком сложными или выдавали сообщение об ошибке, потому что они слишком старые. Поэтому я не смог создать скрипт, который выполняет простой POST/GET запрос.

Итак, я просто хочу отправить POST и GET запросы на сервер. Целевой файл - это простой php-файл.

Это мой первый тестовый скрипт, который я создал на основе https://www.mql5.com/en/code:

К сожалению, я получаю в качестве результата "0", что означает, что запрос не был успешным. Но я не могу выяснить причину.

Надеюсь, вы сможете мне помочь.

Спасибо,

Алекс


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

OK. Спасибо за быстрый ответ. Я еще не тестировал его, но не могли бы вы дать более подробную информацию? Извините за вопрос, но что такое B600? Кроме того, я не могу найти документацию для функций "InternetOpenW" или "InternetOpenA" на сайте http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx.

Откуда берутся "...A" и "...W"?

Спасибо за помощь.

 
coolex:

но что такое B600?

версия 600 и выше (MetaTrader) = сборка 600 и выше = B600 >

coolex:

Откуда берутся "...A" и "...W"?

надеюсь, вы можете прочитать

на той же странице в приведенной вами ссылке написано(в самом низу):

Unicode и ANSI имена InternetOpenUrlW (Unicode) и InternetOpenUrlA (ANSI)

 
OK, я не смог найти функции "InternetOpenW" или "InternetOpenA" на сайте http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx, потому что они там не существуют, но "InternetOpenUrlW" и "InternetOpenUrlA", конечно, существуют.
Поэтому я и спрашивал про "...W" и "...A", а чтение - это не проблема :-).

Основной функцией является "HttpOpenRequest", потому что с ее помощью я могу отправлять POST и GET запросы к URL. Вот документ: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384233(v=vs.85).aspx
Но я не знаю, использовать ли мне "HttpOpenRequestA" или "HttpOpenRequestW", потому что когда я использую "HttpOpenRequestW", я получаю сообщение об ошибке: "Access violation read to 0x0000007B in 'Wininet.dll'". При использовании "HttpOpenRequestA" у меня все та же проблема, что и в начале.

Таким образом, я думаю, что для POST/GET запросов мне вообще не нужна функция "InternetOpenUrlW".

Это текущий код, который все еще не работает :-( :

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

Я написал выше, что вам нужно адаптировать ваш код для UNICODE, и я привел вам только один пример, и вы все еще оставили то, что вам нужно адаптировать для

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

и я заранее говорю вам, что это еще не все, есть еще кое-что.

 

Здравствуйте qjol,

В своем предыдущем сообщении я писал, что замена "HttpOpenRequestA" на "HttpOpenRequestW" вызывает ошибку "Access violation read to 0x0000007B in 'Wininet.dll'".

Все остальные функции я уже изменил на UNICODE.

Извините, если я неправильно понял, но что еще не хватает или неправильно для простого POST/GET запроса?

 
посмотрите здесь
 

Здравствуйте, qjol,

Спасибо за ссылку, которая очень полезна. Я вижу, что получение данных с URL работает, но я все еще не знаю, как отправить данные. Ваш скрипт определяет функцию "HttpOpenRequestW", но не использует ее. Более того, скрипт только получает данные, что работает отлично.

Но все же как я могу размещать данные? Он должен работать с "HttpOpenRequestW", но, как я уже писал ранее, я получаю сообщение об ошибке: "Access violation read to 0x0000007B in 'Wininet.dll'" и "HttpOpenRequestA", очевидно, не работает.

Надеюсь, вы сможете помочь.


 

Я решил проверить ваш код и исправил его, но так как result = false, я проверил его и получаю код ошибки 12005, а согласно списку кодов ошибок microsoft это означает следующее

ERROR_INTERNET_INVALID_URL

12005

URL недействителен.


  #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;
Причина обращения: