Я нашел решение, как отправлять POST-запросы из MetaTrader с помощью функций Wininet. Может быть, это будет полезно кому-то еще.
#property copyright "Copyright 2023, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #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, uchar& response[], int, int& OneInt); int InternetCloseHandle(int); int HttpOpenRequestW(int, string, string, string, string, string& AcceptTypes[], int, int); bool HttpSendRequestW(int, string, int, uchar& arr[], int); #import #import "kernel32.dll" int GetLastError(void); #import void OnStart() { string acceptTypes[1] = {"*/*"}; string headers = "Content-Type: application/json\r\n"; //string headers = "Content-Type: application/x-www-form-urlencoded\r\n"; string JSON_string2 = "{\"username\":\"admin@admin.com\"}"; uchar charArray[]; StringToCharArray( JSON_string2, charArray, 0, StringLen( JSON_string2 ) ); int HttpOpen = InternetOpenW("HTTP_Client_Sample", 1, "", "", 0); int HttpConnect = InternetConnectW(HttpOpen, "12.34.56.129", 3000, "", "", 3, 0, 1); int HttpRequest = HttpOpenRequestW(HttpConnect, "POST", "/testrouter", "HTTP/1.1", "", acceptTypes, 0, 1); bool result = HttpSendRequestW(HttpRequest, headers, StringLen(headers), charArray, ArraySize(charArray)); if(result) { int bytesRead; string serverResponse; int bufferSize = 1024; // Change the buffer size according to your needs uchar responseBuffer[]; ArrayResize(responseBuffer, bufferSize); // Read the response from the server bool readSuccess = InternetReadFile(HttpRequest, responseBuffer, bufferSize, bytesRead); if(readSuccess) { serverResponse = CharArrayToString(responseBuffer, 0, bytesRead); Alert("Server Response: ", serverResponse); } else { Alert("Failed to read server response."); } } Alert("Last MSDN Error =: ", GetLastError()); Alert("This is the POST result: ", result); if (HttpOpen > 0)InternetCloseHandle(HttpOpen); if (HttpRequest > 0)InternetCloseHandle(HttpRequest); }
Спасибо, что поделились своим опытом. А почему бы не отправлять такие запросы через встроенную функцию WebRequest?
E38 #:
Спасибо, что поделились своим опытом. А почему бы не отправлять такие запросы через встроенную функцию WebRequest?
Спасибо, что поделились своим опытом. А почему бы не отправлять такие запросы через встроенную функцию WebRequest?
из кода, очевидно потому-что порт нестандартный (3000)
E38 #:
Спасибо, что поделились своим опытом. А почему бы не отправлять такие запросы через встроенную функцию WebRequest?
Когда используется встроенная функция webrequest, нужно ждать каждый раз, пока запрос не получит ответ, что замедляет работу экспертного советника. Однако с помощью функций wininet можно параллельно отправлять несколько запросов без остановки остального хода работы ЭС.
Спасибо, что поделились своим опытом. А почему бы не отправлять такие запросы через встроенную функцию WebRequest?
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Привет, у меня есть скрипт, с помощью которого я отправляю Post-запрос от Metatrader к серверу Node.js. Запрос доходит до сервера, но JSON-объект, который я отправляю с запросом, не поступает на веб-сервер. Веб-сервер показывает, что req.body пустой. Как правильно настроить функцию в Metatrader, чтобы он также мог отправлять JSON?