WebRequest

Отправляет HTTP-запрос на указанный сервер. Существует два варианта функции:

1. Для отправки простых запросов вида "ключ=значение" с использованием заголовка Content-Type: application/x-www-form-urlencoded.

int  WebRequest(
   const string      method,           // метод HTTP 
   const string      url,              // url-адрес
   const string      cookie,           // cookie
   const string      referer,          // referer
   int               timeout,          // таймаут
   const char        &data[],          // массив тела HTTP-сообщения
   int               data_size,        // размер массива data[] в байтах
   char              &result[],        // массив с данными ответа сервера
   string            &result_headers   // заголовки ответа сервера
   );

2. Для отправки запросов произвольного типа с указанием собственного набора заголовков для более гибкого взаимодействия с различными Web-сервисами.

int  WebRequest(
   const string      method,           // метод HTTP
   const string      url,              // url-адрес
   const string      headers,          // заголовки 
   int               timeout,          // таймаут
   const char        &data[],          // массив тела HTTP-сообщения
   char              &result[],        // массив с данными ответа сервера
   string            &result_headers   // заголовки ответа сервера
   );

Параметры

method

[in]  Метод HTTP.

url

[in]  URL-адрес.

headers

[in]  Заголовки запроса вида "ключ: значение", разделенные переносом строки "\r\n".

cookie

[in]  Значение Cookie.

referer

[in]  Значение заголовка Referer HTTP-запроса.

timeout

[in]  Таймаут в миллисекундах.

data[]

[in]  Массив данных тела HTTP-сообщения.

data_size

[in]  Размер массива data[].

result[]

[out]  Массив с данными ответа сервера.

result_headers

[out] Заголовки ответа сервера.

Возвращаемое значение

Код ответа HTTP-сервера либо -1 в случае ошибки.

Примечание

Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://".

Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение программы и ждет ответа от запрашиваемого сервера. Так как задержки при получении ответа на отправленный запрос могут быть большими, то функция запрещена для вызовов из индикаторов, поскольку индикаторы работают в едином потоке, общем для всех индикаторов и графиков на данном символе. Задержка выполнения индикатора на одном из графиков символа может привести к остановке обновления всех графиков по данному символу.

Функцию можно вызывать только из экспертов и скриптов, так как они работают в собственном потоке выполнения. При вызове из индикатора GetLastError() вернет ошибку 4014 – "Системная функция не разрешена для вызова".

При работе в тестере стратегий функция WebRequest() не выполняется.

Пример

void OnStart()
  {
   string cookie=NULL,headers;
   char   post[],result[];
   string url="https://finance.yahoo.com";
//--- для работы с сервером необходимо добавить URL "https://finance.yahoo.com" 
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
//--- обнуляем код последней ошибки
   ResetLastError();
//--- загрузка html-страницы с Yahoo Finance
   int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
   if(res==-1)
     {
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }
   else
     {
      if(res==200)
        {
         //--- успешная загрузка
         PrintFormat("Файл успешно загружен, размер %d байт.",ArraySize(result));
         //PrintFormat("Заголовки сервера: %s",headers);
         //--- сохраняем данные в файл
         int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
            //--- сохраняем содержимое массива result[] в файл
            FileWriteArray(filehandle,result,0,ArraySize(result));
            //--- закрываем файл
            FileClose(filehandle);
           }
         else
            Print("Ошибка в FileOpen. Код ошибки =",GetLastError());
        }
      else
         PrintFormat("Ошибка загрузки '%s', код %d",url,res);
     }
  }