← К каталогу
Исходный код · ID 3534

Requests

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 ~Requests()

Деструктор класса Requests; закрывает активные сессии и соединения при удалении объекта.

Метод · Requests bool check_dll(string &error)

Проверяет, разрешено ли использование DLL в настройках терминала, и возвращает результат с описанием ошибки.

Метод · Requests bool is_same_host(string url)

Проверяет, совпадает ли хост указанного URL с текущим активным хостом соединения.

Метод · Requests bool open(string url)

Открывает HTTP-сессию и соединение с сервером на основе переданного URL.

Метод · Requests void close()

Закрывает активные HTTP-сессию и соединение, освобождая системные ресурсы.

Метод · Requests void update_url_parts(string url)

Разбирает переданный URL на компоненты: хост, порт, путь и параметры.

Метод · Requests void read(int h_request, string &out)

Читает данные из HTTP-ответа и записывает их в строку.

Метод · Requests Response get(string url, string& arr_data[][])

Отправляет GET-запрос на указанный URL с данными в виде двумерного массива строк.

Метод · Requests Response get(string url, RequestData& _request_data)

Отправляет GET-запрос на указанный URL с данными объекта RequestData.

Метод · Requests Response get(string url, string _str_data)

Отправляет GET-запрос на указанный URL с текстовыми данными.

Метод · Requests Response post(string url, string& arr_data[][])

Отправляет POST-запрос на указанный URL с данными в виде двумерного массива строк.

Метод · Requests Response post(string url, RequestData& _request_data)

Отправляет POST-запрос на указанный URL с данными объекта RequestData.

Метод · Requests Response post(string url, string _str_data)

Отправляет POST-запрос на указанный URL с текстовыми данными.

Метод · Requests Response send(string method, string url, string& arr_data[][])

Отправляет HTTP-запрос (GET или POST) на указанный URL с данными в виде двумерного массива строк.

Метод · Requests Response send(string method, string url, RequestData& _request_data)

Отправляет HTTP-запрос (GET или POST) на указанный URL с данными объекта RequestData.

Метод · Requests 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 и перейдите к оплате.

Стоимость полного кода
687,40₽ ≈ $8.40