Метатрейдер Wininet Пост Json

 

Привет, у меня есть скрипт, с помощью которого я отправляю Post-запрос от Metatrader к серверу Node.js. Запрос доходит до сервера, но JSON-объект, который я отправляю с запросом, не поступает на веб-сервер. Веб-сервер показывает, что req.body пустой. Как правильно настроить функцию в Metatrader, чтобы он также мог отправлять JSON?

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


void OnStart()
{
   string acceptTypes[1] = {"*/*"}; 
   string headers = "Content-Type: application/json";
   //string headers = "Content-Type: application/x-www-form-urlencoded\r\n";
   string JSON_string2 = "{\"username\":\"admin@admin.com\"}";
   
   int HttpOpen = InternetOpenW("HTTP_Client_Sample", 1, "", "", 0);  
   int HttpConnect = InternetConnectW(HttpOpen, "12.34.56.283", 3000, "", "", 3, 0, 1);
   int HttpRequest = HttpOpenRequestW(HttpConnect, "POST", "/testrouter", "HTTP/1.1", "", acceptTypes, 0, 1);
   bool result = HttpSendRequestW(HttpRequest, headers, StringLen(headers), JSON_string2, StringLen(JSON_string2));
   
   Alert("Last MSDN Error =: ", GetLastError());
   Alert("This is the POST result: ", result);
   if (HttpOpen > 0)InternetCloseHandle(HttpOpen);
   if (HttpRequest > 0)InternetCloseHandle(HttpRequest);
}
 

Я нашел решение, как отправлять 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?

из кода, очевидно потому-что порт нестандартный (3000)

 
E38 #:
Спасибо, что поделились своим опытом. А почему бы не отправлять такие запросы через встроенную функцию WebRequest?
Когда используется встроенная функция webrequest, нужно ждать каждый раз, пока запрос не получит ответ, что замедляет работу экспертного советника. Однако с помощью функций wininet можно параллельно отправлять несколько запросов без остановки остального хода работы ЭС.
 
Maxim Kuznetsov #:

из кода, очевидно потому-что порт нестандартный (3000)

Это также еще одно преимущество: с помощью функций wininet вы можете обращаться к различным портам, в то время как с встроенными webrequest можно использовать только порты 80 и 443