HTTP-запрос из Lua через Curl (в т.ч. для QUIK): методы GET и POST, как сделать

Недавно мне понадобилось организовать получение данных с помощью GET и POST запросов из Lua. На такую, казалось бы простую задачу, я потратил огромное количество своего времени, т.к. пришлось компилировать Curl для Lua самому.

Тем не менее мне удалось решить эту проблему и в этой статье я выложил готовую библиотеку, ее настройку, а также пример кода на Lua. Жаль, что этой статьи не было раньше. Надеюсь она сэкономит кому-то драгоценное время.

LuaSocket

Изначально у меня была специфическая задача. Мне нужно было использовать HTTP-запросы в торговом терминале QUIK (64 бита), который умеет выполнять код на Lua. Сперва я хотел воспользоваться готовой библиотекой LuaSocket. Я очень долго пытался заставить ее работать, перекачал, наверно, все возможные версии в интернете, но подружить ее с моим терминалом QUIK мне так и не удалось.

Lua-cURLv3

После десятков мучительных попыток, я решил оставить LuaSocket и использовать Curl для Lua. Заставить работать готовые библиотеки Curl (которых я смог найти в интернете от силы пару штук) для Lua в QUIK у меня также не получилось. Пришлось компилировать Curl из исходников самостоятельно, используя обертку для Lua, которая называется Lua-cURLv3.

Скачать готовый Curl и зависимые от него библиотеки (zlib и OpenSSL) вы можете по этой ссылке. Я компилировал Curl под версию lua-5.4. В связи с этим нужно проверить, что в настройках терминала Quik скрипты запускаются интерпретатором Lua именно этой версии (пример настроек ниже).

Настройки версии Lua в терминале QUIK

Чтобы установить библиотеку сделайте следующее:

  1. Разархивируйте архив и скиньте папки clibs и cURL, а также файл cURL.lua в корень папки с вашим QUIK’ом.
  2. Добавьте в переменную окружения Path вашей операционной системы папки clibs, cURL и папку с QUIK (если не знаете как это сделать — погуглите).
  3. После этого обязательно перезапустите QUIK.

Ниже расположены примеры кода на Lua для взаимодействия с библиотекой (можно запустить как через обычный интерпретатор Lua, так и через QUIK). Чтобы увидеть результат работы скрипта, скачайте программу DebugView (доступна для скачивания на сайте Microsoft).

Метод GET

package.cpath = ";;C:\\Open_Broker_QUIK\\clibs\\?.dll;C:\\Open_Broker_QUIK\\?.dll;" package.path = ";;C:\\Open_Broker_QUIK\\?.lua;" local curl = require("cURL") local easy = curl.easy{ url = "https://jsonplaceholder.typicode.com/posts/1", ssl_verifypeer = false, ssl_verifyhost = false, followlocation = true, writefunction = function(buff) PrintDbgStr(buff) end } easy:perform() PrintDbgStr(tostring(easy:getinfo(curl.INFO_RESPONSE_CODE)))

Метод POST

package.cpath = ";;C:\\Open_Broker_QUIK\\clibs\\?.dll;C:\\Open_Broker_QUIK\\?.dll;" package.path = ";;C:\\Open_Broker_QUIK\\?.lua;" local curl = require("cURL") function main() local easy = curl.easy{ url = "https://jsonplaceholder.typicode.com/posts", ssl_verifypeer = false, ssl_verifyhost = false, followlocation = true, post = false, postfields = '{"key": "value"}', httpheader = {"Content-Type: application/json"}, writefunction = function(buff) message(buff) end } easy:perform() message(tostring(easy:getinfo(curl.INFO_RESPONSE_CODE))) end

Надеюсь, информация из этой статьи вам помогла. 🙂

13 комментариев

  1. Доброго времени суток !
    Не помогло:
    error loading module ‘lcurl’ from file ‘C:\QUIK_VTB\clibs\Lcurl.dll’:
    Не найден указанный модуль.

    1. Сейчас перепроверил — работает. В корень «чистого» QUIK добавил из архива файл и 2 папки. Поменял только в скриптах новые пути к чистому QUIK. В переменные окружения (Path) ничего не добавлял. Все заработало.

      Думаю, вы тоже сделали все правильно, так как если у вас такая ошибка, то значит QUIK нашел модуль и подтянул его. В противном случае ошибка была бы другая. Типа такой: «test_curl.lua:4: module ‘cURL’ not found:»

      Вам нужно проверить зависимости библиотек. Скачайте прогу с гитхаба (https://github.com/lucasg/Dependencies). Запустите DependenciesGui.exe. Перетащите в окно lcurl.dll и libcurl.dll из папки clibs. Раскройте дерево зависимых библиотек. У них не должно быть красных крестиков или чего-то подобного. По крайней мере будет понятно в чем причина и куда копать.

      Короче, скорее всего просто какой-то библиотеки на компе не хватает.

      1. Доброго дня !
        Спасибо за оперативный отклик !
        Не думал, что тоже пройду путь поиска подходящего Lua Socket и не найду ничего полезного для нынешнего квика.
        Сделал все как вы сказали, насчитал пока 10 неувязок, может, есть еще, но пока думаю достаточно для промежуточного вывода. Вот они:
        ext-ms-win-core-app-package-registration-l1-1-0.dll
        ext-ms-win-oobe-query-l1-1-0.dll
        ext-ms-win-wer-xbox-l1-2.dll
        ext-ms-win-appmodel-viewscalefactor-l1-1-0.dll
        ext-ms-win-com-suspendresiliency-l1-1-0.dll
        ext-ms-win-com-apartmentrestriction-l1-1-0.dll
        ext-ms-win-core-winrt-remote-l1-1-0.dll
        ext-ms-win32-subsystem-query-l1-1-0.dll
        ext-ms-windowscore-deviceinfo-l1-1-0.dll
        ext-ms-win-security-chambers-l1-1-0.dll
        Пожалуйста, подскажите — что это может быть ?
        Виндовс 11, уже стояла на купленном официально компе.

        1. У меня Windows 10. Думаю дело не в тех библиотеках, что вы перечислили. У меня некоторые из перечисленных тоже красные. Проверьте еще раз внимательно в Dependencies правильно ли указаны пути до библиотек, которые из файла clibs. У меня так.

          Если у вас также (с учетом вашего пути до папки QUIK), то дело в чем-то другом.

          Ну и, конечно, пути в скрипте должны быть изменены на соответствующие таким образом.

          1. Да, пути к библиотекам такие же с учетом пути до Quik, пути в скрипте тоже корректные, вот только если раскрыть ветку lcurl.dll C:\QUIK…\clibs\zlibwapi.dll , то видны «красные» VCRUNTIME140D.dll и ucrtbased.dll

          2. У меня они нормально отображаются. Добавил со своего компьютера эти dll’ки в архив. Попробуйте добавить их в папку C:/Windows/System32.

  2. dll-ки от С++ и Visual Studio добавил. Теперь отобразились нормально.
    Пример GET с моими путями к QUIK и url не сработал — нужное мне действие не провел, код ответа не отобразился.
    Не буду больше пытаться, спасибо за попытки помочь,
    все сношу в исходное положение, ищу другие пути решения задачи.

  3. Попробовал curl.exe из Windows
    os.execute(«curl -o [filename] [url]»)
    Тоже не отправился мой запрос, ругнулся 2 раза, что url некорректный, хотя из любого браузера и даже из блокнота url работает.

    1. А вот эта ошибка пропала в итоге? «error loading module ‘lcurl’ from file ‘C:\QUIK_VTB\clibs\Lcurl.dll’: Не найден указанный модуль.»

      «нужное мне действие не провел, код ответа не отобразился». Как вы сейчас понимаете, что что-то не так? Предлагаю заставить работать код выше, например, «Метод GET». Он уже работоспособный и даже без изменений (кроме путей) возвращает ответ. Ответ, обратите внимание, выводится через функцию PrintDbgStr(…) в утилиту dbgview64.exe, которую можно с сайта Microsoft скачать. Может поэтому вы код ответа не видите. Либо замените в коде PrintDbgStr на message, тогда в QUIK будет всплывающее окошко.

      1. Ошибка в итоге пропала, все позеленело.
        dbgview64.exe я пользуюсь часто, вывода не было.
        curl.exe от Windows простые сайты опрашивает корректно, а нужный мне url даже не отправляет, хотя браузер это делает.
        Я вернул все в исходное положение, т.е. удалил все ваши файлы, а потом снова все вернул сначала по методичке комментариев, вот только в зависимостях на тех файлах «ext-ms-…», которые я перечислял в комментарии выше, уже не ошибка, а сообщение о том, что файлы не найдены на диске, что мне не нравится.

        1. По моему опыту — если ошибки нет, библиотека должна работать. Не понятно что не работает у вас: сама либа или только обращение по вашему URL? Вы проверили её работоспособность на коде и URL из раздела «Метод GET» при запуске из QUIK’a? Если создать простой скрипт типа PrintDbgStr(‘test’) и запустить из QUIK, dbgview64 отобразит строку «test»?

          1. PrintDbgStr работает корректно и все отображает.
            Не работает обращение по моему URL.
            При запуске с разными опциями Curl.exe (версия от 11.2025) из состава ОС показывается сообщение об ошибке, что части URL не являются командами, обращение на сайт не идет и код ответа не получается. Если ваша либа собрана из исходников с curl.se в 2024 году, пусть она рабочая, поведение должно быть таким же — нет запроса, нет ответа, нет сообщения.
            В любом браузере или проге мой URL отрабатывается.
            Мне проверять работоспособность либы теперь незачем — интерес с curl пропал.
            Отрицательный результат — тоже результат.
            Если будут URL попроще — os.execute(«curl -o [filename] [url]») вполне для меня рабочая тема.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *