Lua socket.http 从示例脚本加载正常,但不能从第三方主机加载



我正在开发一个Lua脚本,该脚本将由第三方程序托管(某些.exe将调用我的脚本中的某个函数)。为了实现我需要的功能(对 Web 服务进行 rest 调用以检索某些信息),我想使用 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 '.sockethttp.lua'
    no file 'D:SomeFolderluasockethttp.lua'
    no file 'D:SomeFolderluasockethttpinit.lua'
    no file 'D:SomeFoldersockethttp.lua'
    no file 'D:SomeFoldersockethttpinit.lua'
    no file 'C:Program Files (x86)Lua5.1luasockethttp.luac'
    no file '.sockethttp.dll'
    no file 'D:SomeFoldersockethttp.dll'
    no file 'D:SomeFolderloadall.dll'
    no file '.socket.dll'
    no file 'D:SomeFoldersocket.dll'
    no file 'D:SomeFolderloadall.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 '.socketcore.lua'
    no file 'D:SomeFolderluasocketcore.lua'
    no file 'D:SomeFolderluasocketcoreinit.lua'
    no file 'D:SomeFoldersocketcore.lua'
    no file 'D:SomeFoldersocketcoreinit.lua'
    no file 'C:Program Files (x86)Lua5.1luasocketcore.luac'
    no file 'C:Program Files (x86)Lua5.1luasocketcore.lua'
    no file '.socketcore.dll'
    no file 'D:SomeFoldersocketcore.dll'
    no file 'D:SomeFolderloadall.dll'
    no file '.socket.dll'
    no file 'D:SomeFoldersocket.dll'
    no file 'D:SomeFolderloadall.dll'

然后我尝试将核心.dll从套接字复制到 D:\SomeFolder 文件夹中,它给了我另一个错误:

error loading module 'socket.core' from file '.socketcore.dll':
    %1 is not a valid Win32 application.

现在我被困住了。我想我一定是做错了什么,但我找不到任何关于如何解决此类问题的适当描述。谁能帮我?

事实证明,Lua要寻找的实际路径是这里的问题。与第三方一起,我们发现,如果我们在D:SomeFolder中放置一组库,现在一切正常。例如,现在有一个插座.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

最新更新