Lua socket.http在示例脚本中可以正常加载,但无法从第三方主机加载。

我正在编写一个 Lua 脚本,将由第三方程序(一些 .exe 将调用我的脚本中的特定函数)托管。为了实现我需要的功能(调用 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 '.\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.

现在我卡住了。我认为我肯定做错了什么,但我找不到任何有关如何解决此类问题的适当描述。有人能帮助我吗?

点赞
用户1442917
用户1442917

你可能需要按照以下文件夹结构(相对于 D:\SomeFolder 文件夹):

socket.lua
socket/core.dll
socket/http.lua
socket/url.lua
socket/<socket 文件夹中 http.lua 需要的任何其他文件>

我刚刚测试了这个配置,它对我有效。

重复载入模块‘socket.http’或之前的错误

这通常是由于从 socket/http.lua 文件本身加载 socket.http 引起的。

2013-09-23 16:56:35
用户81912
用户81912

将下面翻译成中文并且保留原本的 markdown 格式

事实证明,在这里问题出在Lua实际查找的路径上。和第三方一起,我们发现只要我们将一组库放在D:\SomeFolder\中,就可以使一切正常。因此,例如,在D:\SomeFolder\中现在有一个socket.lua,还有一个socket和一个mime文件夹。

一个经验规则是,应用程序所绑定的lua5.1.dll的位置引导了您想要加载的任何模块的位置。

2013-09-30 06:51:46