Волноблог мы в контакте мы в youtube
Описание функции webrequest в MQL

Описание функции webrequest в MQL

4453 | 4 Feb 2015 | Учи матчасть

В процессе реализации своей задумки в программе MT4 (MetaTrader4), мне была необходима в коде функция webrequest. Для меня, как новичку, все что написано в документации об этой функции - тёмный лес. Пришлось разбираться самому, читая некоторые статьи с взаимодействием этой функции и отсеивать ненужную информацию. Помимо этого, мне пришлось ознакомится с некоторыми особенностями взаимодействия компьютера и сервера через интернет. В этой статье я постараюсь описать самое важное о webrequest простым языком.

WebRequest

Отправляет HTTP-запрос на указанный сервер. Проще говоря, это врата из терминала в интернет. Существует два варианта функции.
Разберём сначала первый вариант.


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 // заголовки ответа сервера
 );
  • Первый параметр этой функции method (ввод)
    • GET (В переводе с английского означает "получить") — тип запроса, необходим чтобы что-то получить с сервера.
    • POST (В переводе с английского означает "отправить") — тип запроса, необходим чтобы что-то отправить на сервер.
  • url-адрес (ввод)
    Это то куда надо направить данные или откуда их взять.
  • cookie.
    Это такие "печеньки", точнее информация, которая требуется серверу для распознавания личности. Там могут содержаться логин, пароль от страницы сервера, или еще какая-нибудь информация. Куки - эта строка (string) состоит из пар ключ=значение, которые перечисляются через точку с запятой с пробелом; Например,
    
    string cookie="my=YygC4AG8;";
    cookie+=" fuid=015416cc8e4534b2f5.NS8kPK0Xewg;";
    
  • Referer (ввод)
    Сюда, по-моему, указывается ссылка, которая как-бы указывает серверу откуда ты пришёл.
  • timeout (ввод)
    Указывается значение в миллисекундах. Если ответ сервера превышает это значение, то функция завершает свою работу.
  • char &data[](Вот здесь мне пришлось помучиться)
    Это то, что мы должны отправить серверу. Например, методом Post мы хотим отправить серверу логин и пароль для авторизации. Необходимо составить строку в таком виде
    string param="user="+user+"&password="+pass;
    Потому каждую буковку строчки нужно перевести в массив. Сколько символов в строчке, такой величины и будет массив. Такую операцию можно воспроизвести функцией StringToCharArray.
  • data_size (ввод)
    Размер массива. Ранее я сказал, что размер массива соответствует количеству символов в строке. На самом деле это не так. В переменной string на конце всегда будет 0, как бы символизируя окончание строки. Поэтому массив тоже будет на одно значение больше.
  • result[] (вывод)
    Ответ сервера (например тело Http) приходит в виде массива, похожего на тот что мы посылали ему. Чтобы прочитать его, необходимо перевести его в string используя функцию CharArrayToString.
  • result_headers (вывод)
    Ответ сервера приходит в виде строки. http заголовки - пожалуй главная вещь в общении между устройствами. Они передают основную информацию об устанавливающемся соединении и о передаваемой информации через это соединение. Тут можно найти и вид запроса и информацию о клиенте и куки, которые посылает нам сервер.

Мы рассмотрели простую функцию webrequest. Она нужна для отправки простых запросов вида "ключ=значение" с использованием заголовка Content-Type: application/x-www-form-urlencoded. Это значит, что с помощью этой функции мы можем отправлять информацию в виде текста и не более, т.е. для отправки картинки или файла нам нужен заголовок multipart/form-data, который не поддерживается данной функцией.

Функция webrequest возвращает код ответа HTTP-сервера либо -1 в случае ошибки. Список кодов можно посмотреть здесь.

WebRequest (new)

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

В данной функции практически все тоже самое, за исключением нового параметра headers, и отсутствием referer и cookie

  • headers (ввод)
    Мы уже рассказали, что такое заголовки. В той функции мы могли лишь читать их, теперь же мы их может отправлять. Заголовки как раз содержат то, что пропало из старой функции. Вот пример.
Content-Type: multipart/form-data; boundary=--uYbn6Xon
Referer: http://wave.ucoz.com/blog/0-0-0-262-10
Accept-Encoding: gzip, deflate, lzma
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: dwavebl=CwH+gc5UD9ADseR;

Прошу моих читателей принимать участие в доработке статьи. Принимаются возражения и пожелания. При копировании статьи указывайте ссылку на этот сайт.

комментариев 5
avatar
1 365anonymouse365 • 23:17, 02.06.2016
А есть пример кода полной функции к примеру за логиниться на сайте потом отправить терминалу что либо чтобы он выполнил в советнике это?
avatar
3 Johnny4711 • 17:15, 28.07.2016
С помощью mql можно реализовать одностороннюю работу советника, например отправить и что-то прочитать. Т.е. это код для терминала metatrader. Он что то может сделать с сайтом - либо прочитать с него что то, либо записать на сайт что то.
avatar
2 365anonymouse365 • 23:19, 02.06.2016
Хочу продавать лицензии на мой советник  автомотически но сам пока не допер как все организовать между терминалом и сайтом
avatar
4 familymail2086 • 16:03, 16.11.2016
как передать запрос на веб-сайт из индикатора? есть ли другие функции похожие на WebRequest?
avatar
0
5 Johnny4711 • 14:36, 01.04.2018
Из индикатора функция webrequest не работает. Почему? ответ можно узнать в документации. Аналоги есть, нужно подключить библиотеку "wininet.dll"
Комментировать

Войти