使用标准 LUA API 获取 URL

我想使用 LUA 标准 API 发送 http 请求

我尝试使用 socket.http,但是不起作用,我正在使用的 LUA 框架(我是 X-Plane 飞行模拟器的插件开发人员)不允许我这样做。我只能使用 LUA API。

url = 在这里声明url
io.open(url)

我期望此代码可以获取 URL 中的文件

点赞
用户11491395
用户11491395

这可能是个好主意,但是不幸的是它行不通。也许我在语法方面遗漏了一些东西。

local file = io.popen("curl -s -k".."https://myurl/myfile")
  if file then
      io.close(file)
  is_file = 1 -- 文件找到
else
  is_file = 0 -- 文件未找到
end

即使在/myurl/中没有任何内容,它仍然说找到了文件。

2019-07-23 17:37:08
用户571994
用户571994

这句话 "我期望该代码将文件获取到 URL 中" 令人困惑。

我猜想你的意思是 "我期望该代码将 URL 中的内容/文件/文本获取到本地文件中",并在这样的理解下继续 ...

你的 Lua 代码有几个问题

  1. '-k".."' 会变成 "-khttp",这是一个错误(你需要在 "-k" 后面加一个空格)。

  2. 你没有 读取 结果。 "io.popen"(当成功时)会将命令作为子进程运行,并将文本作为 Lua 文件返回(命名为 "file" ... 使用像 "curl_results" 这样的变量名更加描述性 ... "file" 在许多语言中通常是一个保留字,会使某些读者感到困惑)。

因此,你需要(在成功的 popen 后):s = file:read ("*a"),这将整个结果读到字符串 's' 中。

这是一个可运行的示例,可以通过 ipify.org 的服务获取你的外部/全局/WAN IP 地址:

-- myip.lua

-- 以下代码通过 api.ipify.org 的免费服务获取我们的外部(也称为“全局”或“WAN”)IP地址(如果你加载该页面,则返回你的IP地址(没有换行符))
--
-- 成功:found_data 非 nil,my_ip 有字符串
-- 失败:found_data 为 nil,my_ip 为 nil
--
-- 说明:
--    "-s" 表示 "silent"
--    "-k" 表示 "insecure"(例如忽略任何关于安全证书的问题)
--
-- 变量:
-- locals: curl_data
-- globals: found_data, my_ip

-- 初始化默认结果(nil 表示失败)

found_data = nil  -- 将为 nil 或 1
my_ip = nil       -- 将为 nil 或类似于 "192.1.2.3" 的内容

-- 使用 curl 读取 api.ipify.org ...

local curl_data = io.popen("curl -s -k http://api.ipify.org")

if curl_data then    -- io.popen 工作正常。

   found_data = 1    -- 文件已找到(我通常使用 'true'(并执行:true = 1))。

   my_ip = curl_data:read("*a")  -- 将整个文件读入 my_ip 字符串中。

   if (not my_ip) or (#my_ip == 0) then
      my_ip = nil               -- 以防它是一个空字符串。
      found_data = nil          -- 空结果表示我们没有得到任何数据。
   end

   io.close(curl_data)         -- 关闭文件(管道)。
   curl_data = nil              -- (为了防止它不是全局变量,请删除旧数据)。

   -- 注意:我们没有验证结果是否像 IP 地址。

   -- print(my_ip)             -- 删除注释以进行调试/演示。

else
   found_data = nil -- 没有找到文件。
   print ("no found")
end

-- found_data 应该为 1(my_ip 有 "#.#.#.#"),或
-- found_data 和 my_ip 都将是 nil。

if found_data then
   print("我的 IP 地址(对于世界)是:" .. my_ip)
else
   print("无法找到我的(外部)IP地址")
end

这是一个示例:

lua myip.lua
我的 IP 地址(对于世界)是:16.22.84.45
2022-03-21 23:09:16