Гайд Асинхронные HTTP запросы через Lua C API

delanov

Участник
Автор темы
40
23
Базовые HTTP запросы для выполнениях неблокирующих HTTP-запросов с обработкой ответов через функции обратного вызова (callbacks). Он поддерживает настройку параметров запроса (например, заголовки, таймауты, настройки SSL) и включает минимальный JSON-парсер для обработки ответов. Модуль потокобезопасен благодаря использованию mutex для выполнения калбэков в основном потоке Lua.

Основные преимущества:
Асинхронные запросы: Выполнение HTTP-запросов без блокировки Lua потока.
Настраиваемые параметры: Поддержка методов, заголовков, тела запроса, таймаутов, SSL и других опций.
Парсинг JSON: Встроенный минимальный JSON-парсер, поддерживающий объекты, массивы, строки, числа, булевы значения и null.
Потокобезопасность: Использование мьютекса для защиты очереди калбэков, и выполнения их в основном потоке.
Загрузка файлов: Поддержка multipart/form-data для отправки файлов на сервер.


Модуль предоставляет базовый набор параметров для настройки HTTP-запросов. Модуль извлекает следующие поля из таблицы:

ПолеОписание
methodHTTP-метод (GET, POST, PUT, DELETE и др.)
headersТаблица HTTP-заголовков: { ["Content-Type"] = "application/json" }
bodyТело запроса (например, JSON-строка)
timeoutТаймаут в секундах
follow_redirectsСледовать ли редиректам (true/false)
proxyАдрес прокси (http://proxy:8080)
verify_sslПроверять SSL-сертификаты (true/false)
ca_certПуть к CA-сертификату
client_certПуть к клиентскому сертификату
client_keyПуть к приватному ключу клиента
query_paramsТаблица для GET-параметров: { key1 = "value1" }
filesТаблица файлов для отправки: { ["file"] = "path/to/file.txt" }


Базовый пример использования:
local http = require("HTTP_ASYNC")

http.http_async_request("https://jsonplaceholder.typicode.com/posts/1", function(response)
    if response.error then
        print("Ошибка GET: " .. response.error)
    else
        print("GET Статус: " .. response.status)
        print("GET Данные: ")
        for key, value in pairs(response.data) do
            print(key .. ": " .. tostring(value))
        end
    end
end, {
    method = "GET",
    headers = { ["Content-Type"] = "application/json" },
    timeout = 10
})

http.http_async_request("https://jsonplaceholder.typicode.com/posts", function(response)
    if response.error then
        print("Ошибка POST: " .. response.error)
    else
        print("POST Статус: " .. response.status)
        print("POST Данные: ")
        for key, value in pairs(response.data) do
            print(key .. ": " .. tostring(value))
        end
    end
end, {
    method = "POST",
    headers = { ["Content-Type"] = "application/json" },
    body = '{"title":"foo","body":"bar","userId":1}',
    timeout = 10
})

http.http_async_request("https://api.example.com", callback, {
    method = "POST",
    headers = {
        ["Content-Type"] = "application/json",
        ["Authorization"] = "Bearer token123"
    },
    body = '{"data":"test"}',
    timeout = 15,
    follow_redirects = true,
    verify_ssl = true,
    proxy = "http://proxy:8080",
    ca_cert = "path/to/ca.pem",
    client_cert = "path/to/client.pem",
    client_key = "path/to/key.pem",
    query_params = { key1 = "value1", key2 = "value2" },
    files = { ["file"] = "path/to/file.txt" }
})

local running = true
while running do
    http.http_async_process_callbacks()
end

function onScriptTerminate(script, quitGame)
    if script == thisScript() then
        http.http_async_cleanup()
    end
end

Lua:
http.http_async_process_callbacks()
используется для проверки на наличие ответов в очередях "queue". Таймаута встроенного нету, поэтому ответ может лежать хоть всю сессию скрипта. На остановке работы скрипта стоит вызвать
Lua:
http.http_async_clean()
чтобы избежать утечек памяти.

Используется MSVC C++ 2015 года.
Требуется ОС минимум Windows 7 32-bit.
Для HTTP запросов используется libcurl.
Самая частая ошибка которую можно заметить "Не является приложением Win32". Для этого установите Visual C++ Redistributable х86 от 2022 до 2013 года.
Если не будет проблем с использованием, то расширю функционал библиотеки, в противном случае снесу эту тему. Source code будет немного позже.

🫢Что-то пошло не так? Я в домике
 

Вложения

  • HTTP_ASYNC.dll
    1.2 MB · Просмотры: 3