Как отправить запрос с правильным телом с помощью wininet в mql4 - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть фиктивная веб-служба с URL: http://47.91.231.122:5002/token, которая возвращает данные в формате JSON. Я хочу вызвать эту службу с помощью WINInet APi в mql. Кто-нибудь может мне помочь, как использовать метод "HttpSendRequest", чтобы добавить заголовок иданные для вызова этой услуги?

введите описание изображения здесь

Получите токен доступа с сервера, введя все необходимые данные в теле вызова.URL: http://47.91.231.122:5002/token

имя пользователя: admin@admin.com

пароль: 111111

grant_type: пароль

Ниже приведен мой код.Пожалуйста, покажите мне, как это сделать правильно.Спасибо

#import  "Wininet.dll"
       int InternetOpenW(string name, int config, string, string, int);
       int InternetConnectW(int hopen, string, int, string, string, int, int, int); 
       int HttpRequestW(int hconnect, string, string, int, string, int, string, int); 
       int InternetOpenUrlW(int, string, string, int, int, int);
       bool InternetReadFile(int, uchar &sBuffer[], int, int& OneInt);
       bool InternetCloseHandle(int); [enter image description here][1]
       int HttpOpenRequestA(int, string, string, string, string, string& AcceptTypes[], int, int);
       bool HttpSendRequestA(int, string, int, string, int);
    #import
    #import "kernel32.dll"
       int GetLastError(void);
    #import

правильные данные заголовка и тела?

    int init() 
    {
          string headers = "Content-Type: application/x-www-form-urlencoded\r\n";
          string data = "{\"username\":\"admin@admin.com\",\"password\":\"111111\",\"grant_type\":\"password\"}";
          string acceptTypes[1] = {"*/*"};
          int httpconnect=0;
          int HttpRequest =0;

          int httpopen = Wininet::InternetOpenW("Phoenix_API", 0, " "," ",0 ); 
          int e=kernel32::GetLastError();
          printf("HttpOpen=0 = "+httpopen+", "+e); 
          if (e==0)
             {

Основываясь на картинке, я правильно ее кодирую для подключения?

             httpconnect = Wininet::InternetConnectW(httpopen, "47.91.231.122", 5002, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
             printf("httpconnect=0 = "+httpconnect+", "+e); 
             e=kernel32::GetLastError();
             if (e==0)
                {                                    
                   HttpRequest = HttpOpenRequestA(httpconnect, "POST", "/token", NULL, NULL, acceptTypes, 0, 1);
                   e=kernel32::GetLastError();
                   printf("HttpRequest = "+HttpRequest+", "+e);
                   if (e==0)
                      {  
                      bool A = HttpSendRequestA(HttpRequest, headers, StringLen(headers), "", 0);
                      e=kernel32::GetLastError();
                      printf("A = "+A+", "+e);  

я получаю фиктивное сообщение DOCTYPE HTML PUBLIC "- // W3C // DTD HTML 4.01 // EN"

                      //--- Define buffers
                      uchar ch[512]={0,0,0,0};
                      string temp="";

                      //--- Retrieve data from file
                      int cnt=0;
                      while(Wininet::InternetReadFile(HttpRequest,ch,512,cnt))
                         {
                         if(cnt<=0) break;
                         temp=temp+CharArrayToString(ch,0,cnt);
                         printf(temp);
                        } 
                      MessageBox(temp, "HTTP READ:", 0x00000030);                
                 }
            } 
       }
       //--- Close connection
       if (HttpRequest > 0) InternetCloseHandle(HttpRequest); 
       if (httpconnect > 0) InternetCloseHandle(httpconnect); 
       if (httpopen > 0) InternetCloseHandle(httpopen); 
    }
...