Lua socket.http нормально загружается из примера сценария, но не загружается со стороннего хоста
Я работаю над сценарием Lua, который будет размещен в сторонней программе (некоторые.exe, которые будут вызывать определенную функцию в моем сценарии). Для реализации нужной мне функциональности (позвоните в веб-сервис, чтобы получить определенную информацию), я хочу использовать socket.http.request
,
Сначала я создал пример сценария для вызова, который хотел сделать:
local io = require("io")
local http = require("socket.http")
local ltn12 = require("ltn12")
local data = "some data")
local response = {}
socket.http.request({
method = "POST",
url = "http://localhost:8080/someServce/rest/commands/someCommand",
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
["Content-Length"] = string.len(data)
},
source = ltn12.source.string(data),
sink = ltn12.sink.table(response)
})
print(table.concat(response))
print("Done")
Это отлично работает. Я получаю ответ, который ожидаю. Теперь, когда я пытаюсь сделать это со стороннего хоста, я сначала получил ошибку:
module 'socket.http' not found:
no field package.preload['socket.http']
no file '.\socket\http.lua'
no file 'D:\SomeFolder\lua\socket\http.lua'
no file 'D:\SomeFolder\lua\socket\http\init.lua'
no file 'D:\SomeFolder\socket\http.lua'
no file 'D:\SomeFolder\socket\http\init.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\http.luac'
no file '.\socket\http.dll'
no file 'D:\SomeFolder\socket\http.dll'
no file 'D:\SomeFolder\loadall.dll'
no file '.\socket.dll'
no file 'D:\SomeFolder\socket.dll'
no file 'D:\SomeFolder\loadall.dll'
Я попытался скопировать папку сокетов из папки LUA в папку, из которой выполняется хост (D:\SomeFolder). Затем он находит модуль, но не может загрузить его с другой ошибкой:
loop or previous error loading module 'socket.http'
Я также попытался переместить оператор require за пределы функции и сделать его глобальным. Это дает мне еще одну ошибку:
module 'socket.core' not found:
no field package.preload['socket.core']
no file '.\socket\core.lua'
no file 'D:\SomeFolder\lua\socket\core.lua'
no file 'D:\SomeFolder\lua\socket\core\init.lua'
no file 'D:\SomeFolder\socket\core.lua'
no file 'D:\SomeFolder\socket\core\init.lua'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\core.luac'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\core.lua'
no file '.\socket\core.dll'
no file 'D:\SomeFolder\socket\core.dll'
no file 'D:\SomeFolder\loadall.dll'
no file '.\socket.dll'
no file 'D:\SomeFolder\socket.dll'
no file 'D:\SomeFolder\loadall.dll'
Затем я попытался скопировать core.dll из сокета в папку D: \ SomeFolder, и это дало мне еще одну ошибку:
error loading module 'socket.core' from file '.\socket\core.dll':
%1 is not a valid Win32 application.
Теперь я застрял. Я думаю, что я, должно быть, делаю что-то совершенно не так, но не могу найти правильного описания того, как решить подобные проблемы. Может кто-нибудь мне помочь?
2 ответа
Как выясняется, проблема заключается в том, какой путь будет искать Луа. Вместе с третьей стороной мы обнаружили, что если мы поместим набор библиотек в D:\SomeFolder\
теперь все работает. Так, например, теперь есть socket.lua в D:\SomeFolder\
и там есть розетка и пантомима.
Практическое правило заключается в том, что расположение файла lua5.1.dll, связанного с приложением, приводит к расположению любых модулей, которые вы хотите загрузить.
Вы, вероятно, должны иметь следующую структуру папок (относительно D:\SomeFolder
папка):
socket.lua
socket/core.dll
socket/http.lua
socket/url.lua
socket/<any other file from socket folder required by http.lua>
Я только что проверил эту конфигурацию, и она работает для меня.
Цикл или предыдущая ошибка загрузки модуля "socket.http"
Обычно это вызвано загрузкой socket.http
от socket/http.lua
сам файл.