Описание функции webrequest в MQL
В процессе реализации своей задумки в программе 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;
- 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;
Прошу моих читателей принимать участие в доработке статьи. Принимаются возражения и пожелания. При копировании статьи указывайте ссылку на этот сайт.