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

时间:2013-09-23 08:39:45

标签: lua luasocket

我正在处理一个Lua脚本,该脚本将由第三方程序托管(一些.exe将在我的脚本中调用某个函数)。为了实现我需要的功能(对Web服务进行休息调用以检索某些信息)我想使用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'

我尝试将socket文件夹从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从socket复制到D:\ SomeFolder文件夹,它给了我另一个错误:

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

现在我被卡住了。我认为我必须做一些完全错误的事情,但我找不到任何关于如何解决这类问题的正确描述。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

事实证明,Lua要寻找的实际路径是这里的问题。我们与第三方一起发现,如果我们在D:\SomeFolder\中放置一组库,现在一切正常。例如,D:\SomeFolder\中现在有一个socket.lua,并且还有一个套接字和一个mime forlder。

经验法则似乎是应用程序绑定的 lua5.1.dll 的位置导致您要加载的任何模块的位置。

答案 1 :(得分:1)

您可能需要具有以下文件夹结构(相对于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引起的。