Ошибка в WebRequest

 

Здравствуйте всем!

Есть функция WebRequest:

string Web()
{ 
   string cookie=NULL,headers,content[]; 
   char post[],result[];
   int timeout=5000,res; 
   
   string url="https://66.45.229.5/api";
   string PostString = "account="+(string)AccountInfoInteger(ACCOUNT_LOGIN)+
                                                  "&data="+HistoricalResults();
                                                  
   StringToCharArray(PostString, post, 0, StringLen(PostString));
          
   ResetLastError(); 
   
   res = WebRequest("POST",url,cookie,NULL,timeout,post,0,result,headers); 
        
   if(res==200)
        return CharArrayToString(result); 
   
   return "";
}

Запрос идет на сервер по IP адресу https://66.45.229.5/api и в ответе ошибка - 1

В чем может быть дело? Является ли проблемой запрос к серверу по IP, а не по домену ?

Спасибо заранее.

 

Так же использовал вариант с библиотекой:

string  sUrl; 
string sData;
int logHandle = -1;
bool bWinInetDebug = false;
string content[];

int hSession_IEType;
int hSession_Direct;
int Internet_Open_Type_Preconfig = 0;
int Internet_Open_Type_Direct = 1;
int Internet_Open_Type_Proxy = 3;
int Buffer_LEN = 80;

#import "wininet.dll"

   #define INTERNET_FLAG_PRAGMA_NOCACHE    0x00000100 // Forces the request to be resolved by the origin server, even if a cached copy exists on the proxy.
   #define INTERNET_FLAG_NO_CACHE_WRITE    0x04000000 // Does not add the returned entity to the cache. 
   #define INTERNET_FLAG_RELOAD            0x80000000 // Forces a download of the requested file, object, or directory listing from the origin server, not from the cache.

   int InternetOpenW( string sAgent, int lAccessType, string sProxyName, string sProxyBypass, int lFlags );
   int InternetOpenUrlW(int     hInternetSession,string         sUrl,string     sHeaders="",int         lHeadersLength=0,int    lFlags=0,int    lContext=0);    
   int InternetReadFile(int hFile, uchar &sBuffer[],int lNumBytesToRead,int &lNumberOfBytesRead[]); 
   int InternetCloseHandle(int  hInet); 

#import
//-----------------------------------------------------------------------------------------------------------------------------------------------
void OnStart()
{
   sUrl = "https://66.45.229.5/api?account="+(string)AccountInfoInteger(ACCOUNT_LOGIN)+"&data="+HistoricalResults();

   GrabWeb(sUrl,sData);
   
   Alert(sData);
}
//-----------------------------------------------------------------------------------------------------------------------------------------------
int hSession(bool Direct)
{
     string InternetAgent;
     if (hSession_IEType == 0)
     {
             InternetAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)";
             hSession_IEType = InternetOpenW(InternetAgent, Internet_Open_Type_Preconfig, "0", "0", 0);
             hSession_Direct = InternetOpenW(InternetAgent, Internet_Open_Type_Direct, "0", "0", 0);
     }
     if (Direct) 
         return(hSession_Direct); 
     else 
         return(hSession_IEType); 
}
//-----------------------------------------------------------------------------------------------------------------------------------------------
bool GrabWeb(string strUrl, string& strWebPage)
{
  int     hInternet;
  int             iResult;
  int     lReturn[]       = {1};
  uchar sBuffer[1024];
  int     bytes;
  uint flags=INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD;

  hInternet = InternetOpenUrlW(hSession(false), strUrl, NULL, 0, flags);       
  //hInternet = InternetOpenUrlW(hSession(FALSE), strUrl, "0", 0, 
  //                                                      INTERNET_FLAG_NO_CACHE_WRITE | 
  //                                                      INTERNET_FLAG_PRAGMA_NOCACHE | 
  //                                                      INTERNET_FLAG_RELOAD, 0);
                                                          
  
  if (hInternet == 0) 
          return(false);

  Print("Reading URL: " + strUrl);           //added by MN        
  iResult = InternetReadFile(hInternet, sBuffer, Buffer_LEN, lReturn);
  

  if (iResult == 0)  return(false);
  bytes = lReturn[0];
  strWebPage = CharArrayToString(sBuffer, 0, lReturn[0],CP_UTF8);
  
  //If there's more data then keep reading it into the buffer
  while (lReturn[0] != 0)
     {
          iResult = InternetReadFile(hInternet, sBuffer, Buffer_LEN, lReturn);
          if (lReturn[0]==0) break;
          bytes = bytes + lReturn[0];
          strWebPage = strWebPage + CharArrayToString(sBuffer, 0, lReturn[0],CP_UTF8);
  }
  Print("Closing URL web connection");   //added by MN
  iResult = InternetCloseHandle(hInternet);
  if (iResult == 0) return(false);                
  
  return(true);
}

Приходит пустота в ответ.

 
Artem Markevych:

Запрос идет на сервер по IP адресу https://66.45.229.5/api и в ответе ошибка - 1


попробуйте конектится все-таки к http://66.45.229.5/api

 
Sergey Dzyublik:

попробуйте конектится все-таки к http://66.45.229.5/api

Возвращает 404 ошибку (нет страницы).

 

Возможно, причина в том, что не проходит валидация сертификата безопасности для https, поскольку указывается ip адресс, а не домен для которого сертификат:

DNS Name=forex.com
DNS Name=mail.forex.com
DNS Name=www.forex.com



Попробуйте добавить сертификат в список доверенных сертификатов (легко проверяется из хрома в анонимном режиме, что бы не было предупреждения о невалидном сертификате)
или перевести работу сайта на http, если он ваш.

Работает ли адекватно MQL WebRequest с запросами на ip, честно говоря, не знаю, в теории должен ))

 
Artem Markevych:

Есть функция WebRequest:

Запрос идет на сервер по IP адресу https://66.45.229.5/api и в ответе ошибка - 1

В чем может быть дело? Является ли проблемой запрос к серверу по IP, а не по домену ?

Пробуйте то же самое в браузере и смотрите лог запросов. Если в браузере работает, ищите разницу между хедерами запросов, которые генерирует WebRequest и браузер.

 
Stanislav Korotky:

Пробуйте то же самое в браузере и смотрите лог запросов. Если в браузере работает, ищите разницу между хедерами запросов, которые генерирует WebRequest и браузер.


Спасибо. Не стал заморачиваться и сказал клиенту купить домен :)

 
Artem Markevych:

Спасибо. Не стал заморачиваться и сказал клиенту купить домен :)


Ну да, зачем тратить свое время и разобраться в том, что обязались сделать, если можно просто кинуть клиента на бабки.
Шикарный подход.


1) добавить в hosts что по пути C:\Windows\System32\drivers\etc строку:
66.45.229.5 mail.forex.com
2) добавить сертификат от https://66.45.229.5/api в список доверенных 

И по идеи все должно удачно работать как:

string Web()
{ 
   string cookie=NULL,headers,content[]; 
   char post[],result[];
   int timeout=5000,res; 
   
   string url="https://mail.forex.com/api";
   string PostString = "account="+(string)AccountInfoInteger(ACCOUNT_LOGIN)+
                                                  "&data="+HistoricalResults();
                                                  
   StringToCharArray(PostString, post, 0, StringLen(PostString));
          
   ResetLastError(); 
   
   res = WebRequest("POST",url,cookie,NULL,timeout,post,0,result,headers); 
        
   if(res==200)
        return CharArrayToString(result); 
   
   return "";
}
Причина обращения: