class Requests
Основной класс библиотеки для выполнения HTTP-запросов и управления соединениями.
Сообщите нам, если считаете, что материал размещён без разрешения.
Обращение по товару «requests.mqh» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
Requests — это библиотека для MQL4, упрощающая выполнение HTTP-запросов из торговых советников и индикаторов. Она предоставляет удобный интерфейс для отправки GET- и POST-запросов, а также универсального метода send для работы с HTTP-протоколом.
Библиотека управляет HTTP-сессиями и соединениями, автоматически открывая и закрывая их по мере необходимости. Поддерживается работа с различными форматами данных: двумерные массивы строк, объекты RequestData и обычные строки.
Внутренне Requests использует системные API Windows (WinINET) для взаимодействия с интернетом. Перед началом работы библиотека проверяет, разрешено ли использование DLL в настройках терминала, что необходимо для корректного функционирования.
Объект Response используется для хранения результатов запросов: текст ответа, URL, параметры и информация об ошибках. Библиотека разработана для платформы MetaTrader 4.
Классов: 1 · методов: 15 · конструкторов: 1 · деструкторов: 1 · отдельных функций: 11
class Requests
Основной класс библиотеки для выполнения HTTP-запросов и управления соединениями.
DWORD GetLastError(int)
Возвращает код последней ошибки Windows (обёртка над системным API).
DWORD InternetAttemptConnect(DWORD dwReserved)
Инициирует попытку установления интернет-соединения (обёртка над системным API).
HINTERNET InternetOpenW(LPCTSTR lpszAgent, DWORD dwAccessType, LPCTSTR lpszProxyName, LPCTSTR lpszProxyBypass, DWORD dwFlags)
Открывает HTTP-сессию с указанным агентом пользователя и параметрами прокси (обёртка над системным API).
HINTERNET InternetConnectW(HINTERNET hInternet, LPCTSTR lpszServerName, INTERNET_PORT nServerPort, LPCTSTR lpszUsername, LPCTSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext)
Устанавливает соединение с HTTP-сервером по хосту и порту (обёртка над системным API).
HINTERNET HttpOpenRequestW(HINTERNET hConnect, LPCTSTR lpszVerb, LPCTSTR lpszObjectName, LPCTSTR lpszVersion, LPCTSTR lpszReferer, int lplpszAcceptTypes, uint dwFlags, DWORD_PTR dwContext)
Подготавливает HTTP-запрос с указанным методом и объектом (обёртка над системным API).
BOOL HttpSendRequestW(HINTERNET hRequest, LPCTSTR lpszHeaders, DWORD dwHeadersLength, LPVOID lpOptional[], DWORD dwOptionalLength)
Отправляет HTTP-запрос с заголовками и данными (обёртка над системным API).
HINTERNET InternetOpenUrlW(HINTERNET hInternet, LPCTSTR lpszUrl, LPCTSTR lpszHeaders, DWORD dwHeadersLength, uint dwFlags, DWORD_PTR dwContext)
Открывает URL в рамках активной сессии (обёртка над системным API).
BOOL InternetReadFile(HINTERNET hFile, LPVOID lpBuffer[], DWORD dwNumberOfBytesToRead, LPDWORD lpdwNumberOfBytesRead)
Читает данные из HTTP-ответа в буфер (обёртка над системным API).
BOOL InternetCloseHandle(HINTERNET hInternet)
Закрывает системный дескриптор соединения (обёртка над системным API).
BOOL InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, LPDWORD lpBuffer, DWORD dwBufferLength)
Устанавливает параметры интернет-соединения (обёртка над системным API).
BOOL InternetQueryOptionW(HINTERNET hInternet, DWORD dwOption, LPDWORD lpBuffer, LPDWORD lpdwBufferLength)
Запрашивает параметры интернет-соединения (обёртка над системным API).
Requests()
Конструктор класса Requests; инициализирует объект ответа и сбрасывает параметры соединения.
~Requests()
Деструктор класса Requests; закрывает активные сессии и соединения при удалении объекта.
bool check_dll(string &error)
Проверяет, разрешено ли использование DLL в настройках терминала, и возвращает результат с описанием ошибки.
bool is_same_host(string url)
Проверяет, совпадает ли хост указанного URL с текущим активным хостом соединения.
bool open(string url)
Открывает HTTP-сессию и соединение с сервером на основе переданного URL.
void close()
Закрывает активные HTTP-сессию и соединение, освобождая системные ресурсы.
void update_url_parts(string url)
Разбирает переданный URL на компоненты: хост, порт, путь и параметры.
void read(int h_request, string &out)
Читает данные из HTTP-ответа и записывает их в строку.
Response get(string url, string& arr_data[][])
Отправляет GET-запрос на указанный URL с данными в виде двумерного массива строк.
Response get(string url, RequestData& _request_data)
Отправляет GET-запрос на указанный URL с данными объекта RequestData.
Response get(string url, string _str_data)
Отправляет GET-запрос на указанный URL с текстовыми данными.
Response post(string url, string& arr_data[][])
Отправляет POST-запрос на указанный URL с данными в виде двумерного массива строк.
Response post(string url, RequestData& _request_data)
Отправляет POST-запрос на указанный URL с данными объекта RequestData.
Response post(string url, string _str_data)
Отправляет POST-запрос на указанный URL с текстовыми данными.
Response send(string method, string url, string& arr_data[][])
Отправляет HTTP-запрос (GET или POST) на указанный URL с данными в виде двумерного массива строк.
Response send(string method, string url, RequestData& _request_data)
Отправляет HTTP-запрос (GET или POST) на указанный URL с данными объекта RequestData.
Response send(string method, string url, string _str_data)
Отправляет HTTP-запрос (GET или POST) на указанный URL с текстовыми данными; метод определяется по переданному параметру.
#property version "1.00"
#property description "Requests is a simple HTTP library for mql4, built for human beings."
#property library
#define HINTERNET int
#define BOOL int
#define INTERNET_PORT int
#define DWORD int
#define DWORD_PTR int
#define LPDWORD int&
#define LPVOID uchar&
#define LPCTSTR string&
string nill = "";
#import "Kernel32.dll"
DWORD GetLastError(int);
#import
#import "wininet.dll"
DWORD InternetAttemptConnect(DWORD dwReserved);
HINTERNET InternetOpenW(LPCTSTR lpszAgent, DWORD dwAccessType, LPCTSTR lpszProxyName, LPCTSTR lpszProxyBypass, DWORD dwFlags);
HINTERNET InternetConnectW(HINTERNET hInternet, LPCTSTR lpszServerName, INTERNET_PORT nServerPort, LPCTSTR lpszUsername, LPCTSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext);
HINTERNET HttpOpenRequestW(HINTERNET hConnect, LPCTSTR lpszVerb, LPCTSTR lpszObjectName, LPCTSTR lpszVersion, LPCTSTR lpszReferer, int /*LPCTSTR* */ lplpszAcceptTypes, uint/*DWORD*/ dwFlags, DWORD_PTR dwContext);
BOOL HttpSendRequestW(HINTERNET hRequest, LPCTSTR lpszHeaders, DWORD dwHeadersLength, LPVOID lpOptional[], DWORD dwOptionalLength);
HINTERNET InternetOpenUrlW(HINTERNET hInternet, LPCTSTR lpszUrl, LPCTSTR lpszHeaders, DWORD dwHeadersLength, uint/*DWORD*/ dwFlags, DWORD_PTR dwContext);
BOOL InternetReadFile(HINTERNET hFile, LPVOID lpBuffer[], DWORD dwNumberOfBytesToRead, LPDWORD lpdwNumberOfBytesRead);
BOOL InternetCloseHandle(HINTERNET hInternet);
BOOL InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, LPDWORD lpBuffer, DWORD dwBufferLength);
BOOL InternetQueryOptionW(HINTERNET hInternet, DWORD dwOption, LPDWORD lpBuffer, LPDWORD lpdwBufferLength);
#import
#define OPEN_TYPE_PRECONFIG 0
#define INTERNET_SERVICE_HTTP 3
#define INTERNET_FLAG_PRAGMA_NOCACHE 0x00000100
#define INTERNET_FLAG_KEEP_CONNECTION 0x00400000
#define INTERNET_FLAG_SECURE 0x00800000
#define INTERNET_FLAG_RELOAD 0x80000000
#define INTERNET_OPTION_SECURITY_FLAGS 31
#define ERROR_INTERNET_INVALID_CA 12045
#define SECURITY_FLAG_IGNORE_UNKNOWN_CA 0x00000100
#include "classes/request_data.mqh"
#include "classes/response.mqh"
#include "classes/_url_parts.mqh"
class Requests {
public:
int port;
string host;
string path;
string parameters;
string user;
string password;
string headers_add;
int h_session;
int h_connect;
Response response;
Requests() {
response = Response();
headers_add="";
h_session = -1; h_connect = -1; user = ""; password = "";
}
~Requests() {
close();
}
bool check_dll(string &error) {
error = "";
if(!IsDllsAllowed()) {
error = "requests: ERROR It is necessary to allow the use of DLL in the expert settings";
Comment(error);
return(false);
}
return(true);
}
bool is_same_host(string url) {
_UrlParts _url_parts;
_url_parts.split(url);
if (_url_parts.host != host) return(false);
return(true);
}
bool open(string url) {
if (h_session > 0 || h_connect > 0) close(); // if connection was opend, close session and connect
if (InternetAttemptConnect(0) != 0) { Print("requests: ERROR InternetAttemptConnect"); return(false); }
string user_agent = "Microsoft Internet Explorer";
int service = INTERNET_SERVICE_HTTP;
h_session = InternetOpenW(user_agent, OPEN_TYPE_PRECONFIG, nill, nill, 0);
if (h_session <= 0) { Print("requests: ERROR create session, InternetOpenW()"); close(); return(false); }
h_connect = InternetConnectW(h_session, host, port, user, password, service, 0, 0);
if (h_connect <= 0) { Print("requests: ERROR create connect, InternetConnectW()"); close(); return(false); }
return(true);
}
void close() {
if (h_session>0) {InternetCloseHandle(h_session); h_session = -1;#ifdef DEBUG_REQUESTS Print("requests: close session");#endif}
if (h_connect>0) {InternetCloseHandle(h_connect); h_connect = -1;#ifdef DEBUG_REQUESTS Print("requests: close connect");#endif}
}
void update_url_parts(string url) {
_UrlParts _url_parts;
_url_parts.split(url);
port = _url_parts.port;
host = _url_parts.host;
path = _url_parts.path;
parameters = _url_parts.parameters;
}
void read(int h_request, string &out) {
out = "";
uchar ch[100];
int dwBytes, h = -1;
while(InternetReadFile(h_request, ch, 100, dwBytes)) {
if (dwBytes <= 0) break; out +Показано первые 50% кода (символов: 6874)
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.