如何通过Lua语言请求接口拿到数据

文章目录

    • 概要
    • http客户端
    • 通过请求下载数据

概要

当某个需求是需要在模块内请求接口拿到数据,需要使用http客户端调用接口

http客户端

LuaSOC请求接口官方文档

调用:http.request(method,url,headers,body,opts,ca_file,client_ca, client_key, client_password)

参数:

传入值类型

解释

string

请求方法, 支持 GET/POST 等合法的HTTP方法

string

url地址, 支持 http和https, 支持域名, 支持自定义端口

tabal

请求头 可选 例如 {[“Content-Type”] = “application/x-www-form-urlencoded”}

string/zbuff

body 可选

table

额外配置 可选 包含 timeout:超时时间单位ms 可选,默认10分钟,写0即永久等待 dst:下载路径,可选 adapter:选择使用网卡,可选 debug:是否打开debug信息,可选,ipv6:是否为ipv6 默认不是,可选 callback:下载回调函数,参数 content_len:总长度 body_len:以下载长度 userdata 用户传参,可选 userdata:回调自定义传参

string

服务器ca证书数据, 可选, 一般不需要

string

客户端ca证书数据, 可选, 一般不需要, 双向https认证才需要

string

客户端私钥加密数据, 可选, 一般不需要, 双向https认证才需要

string

客户端私钥口令数据, 可选, 一般不需要, 双向https认证才需要

返回值:

返回值类型

解释

int

code , 服务器反馈的值>=100, 最常见的是200.如果是底层错误,例如连接失败, 返回值小于0

tabal

headers 当code>100时, 代表服务器返回的头部数据

string/int

body 服务器响应的内容字符串,如果是下载模式, 则返回文件大小

headers请求头有就写没有就空的,body参数也是的

GET请求

http.request("GET","http://www.baidu.com",{},"",opts)

POST请求

http.request("POST","http://www.baidu.com",{},"",opts)

通过请求下载数据

下载文件的示例代码:

--[[
xmodem 下载文件
@api downloadFile(url, destination,texpected_md5ype)
@string url http客户端请求地址
@string destination 文件路径
@string expected_md5 MD5校验
@return bool 结果
@usage
downloadFile("http://www.bai.com","/luadb/test.bin")
]]
-- -- 下载文件并验证MD5
local CONFIG = {
  destination = "/data.bin",
  timeout = 30000,          -- 超时时间(毫秒)
  max_retries = 3,          -- 最大重试次数
  retry_delay = 1000,       -- 重试间隔时间(毫秒)
}
local function downloadFile(url, destination, expected_md5)
  local req_headers = {
      ['Content-Type'] = 'application/octet-stream',
      ['Accept'] = 'application/octet-stream'
  }

  for attempt = 1, CONFIG.max_retries do
      log.info(string.format("下载尝试 %d/%d: %s", attempt, CONFIG.max_retries, url))

      local opts = {
          dst = destination,
          timeout = CONFIG.timeout
      }

      local response = http.request("GET", url, req_headers, "", opts)
      if not response then
          log.error("HTTP 请求失败")
      else
          local code, headers, body = response.wait()
          log.info("HTTP 响应", "状态码:", code)
          if code == 200 then
              log.info("文件成功下载到:", destination)
              -- 打开并读取下载的文件
              local f = io.open(destination, "rb")
              log.info("打开的文件",f)
              if not f then
                  log.error("无法打开文件:", destination)
              else
                  local data = f:read("*a")
                  f:close()
                  if not data then
                      log.error("文件读取失败:", destination)
                  else
                      -- 验证文件内容
                      local crc = crypto.md5(data)
                      log.info("MD5 校验", crc)
                      if crc == expected_md5 then
                          log.info("MD5 校验通过")
                          sys.publish("download_success", true)
                          http_download.download_request = 1
                          return true
                      else
                          log.error("MD5 校验未通过")
                          sys.publish("download_success", false)
                          http_download.download_request = 0
                          return false
                      end
                  end
              end
          else
              log.error("HTTP 请求失败,状态码:", code)
          end
      end

      -- 如果下载失败,等待后重试
      if attempt < CONFIG.max_retries then
          log.warn(string.format("下载失败,%d毫秒后重试...", CONFIG.retry_delay))
          sys.wait(CONFIG.retry_delay)
      end
  end

  -- 所有重试尝试均失败
  log.error("所有下载尝试均失败")
  sys.publish("download_success", false)
  return false
end

-- 下载任务初始化
sys.taskInit(function()
  sys.wait(500)
  sys.waitUntil("IP_READY") -- 等待网络连接
  log.info("网络已就绪,开始等待下载指令...")

  while true do
      local _, data = sys.waitUntil("download")
      if data then
          local downloadUrl = data:sub(5, -35)
          local expected_md5 = data:sub(-32, -1)
          local destination = CONFIG.destination

          log.info("收到下载指令:", string.fromHex(downloadUrl), "预期MD5:", expected_md5)

          if downloadUrl and #downloadUrl > 0 then
              local decoded_url = string.fromHex(downloadUrl)
              if decoded_url and #decoded_url > 0 then
                  downloadFile(decoded_url, destination, expected_md5)
              else
                  log.error("下载URL解码失败或为空")
                  sys.publish("download_success", false)
              end
          else
              log.warn("下载URL无效或为空")
              sys.publish("download_success", false)
          end
      else
            log.warn("未收到有效的下载指令")
            sys.wait(600000) -- 休眠10分钟后继续循环
      end



  end
end)







下载成功的示例:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899681.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【日记】感觉沟通是件很难精通的事情(1397 字)

正文 今天霜降&#xff0c;感觉得开始戴手套了&#xff0c;去年就是因为戴得早&#xff0c;所以避免了生冻疮。不知道今年还会不会有这么幸运。虽然霜降&#xff0c;但意外地天气很好呢。下午又找了个时间稍微偷溜出去发了一会儿呆。可惜每次下班天都黑了&#xff0c;天气好的话…

HCIP--1

同一区域内的OSPF路由器拥有一致的 LSDB, 在区域内&#xff0c;OSPF 采用 SPF算法计算路由一个区域太多路由器&#xff0c;硬件资源跟不上&#xff0c;所以多划分区域 OSPF 路由计算原理 1. 区域内路由计算 LSA 在OSPF中&#xff0c;每个路由器生成 LSA&#xff0c;用于告诉…

基于SpringBoot的宠物爱好者交流系统的设计与实现(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Facebook的AI驱动发展:人工智能如何改变社交体验

个性化内容推荐 Facebook利用AI算法分析用户的行为数据&#xff0c;包括点赞、评论、分享和浏览历史。这些数据使得平台能够深入了解用户的兴趣和偏好&#xff0c;从而提供个性化的内容推荐。例如&#xff0c;用户在浏览动态时&#xff0c;AI系统会根据用户的互动历史&#xf…

快速获取 GitHub 个人资料成就徽章

效果展示 成就徽章 个人资料中可以选择是否显示成就徽章&#xff0c;Settings-Public profile&#xff0c;勾选Show Achievements on my profile。 徽章名称获取方式Heart On Your Sleeve使用 ❤️ 表情符号对 GitHub 上的内容做出反应 (正在测试中)Open Sourcerer用户已将 P…

【芯片设计】DC综合retiming策略的学习与实践

对于DC综合中的retiming策略早有耳闻&#xff0c;但是一直没有比较系统的学习和实验过&#xff0c;正好借着这次交付过程的归纳总结机会&#xff0c;把一些零零散散的收获学习记录下。 记得刚出新手村时和某位大佬聊到过&#xff0c;他说你逻辑里写了在某级计算一个结果&#…

etl-查询错误log日志和oracle删除数据表空间

查看weblogic日志的目录 建立连接ssh root192.168.30.1xx 密码hygd123 找到下面路径中的文件 cd /home/weblogic/Oracle/Middleware/user_projects/domains/base_domain/bapp-logs 查看log日志 tail -f -n 400 Adminservers.log oracle删除表空间&#xff08;切换到dba用户…

【SoC】被忽略的reset结构设计

1024这天爆出来的设计失误&#xff0c;真的很应景啦&#xff01; 先献上A72的reset结构图吧&#xff0c;虽然最终的解决方案不是按照这个来的&#xff0c;不过也给了一个相对较清晰的reset架构了。 异步复位树 当对整个电路进行复位的时候&#xff0c;使用异步复位&#xff0c…

K8s-pod控制器HPA、DS、Job、CJ

一、Horizontal Pod Autoscaler(HPA) 在上一节&#xff0c;我们已经可以实现通过手工执行kubectl scale命令实现Pod扩容或缩容&#xff0c;但是这显然不符合Kubernetes的定位目标——自动化、智能化。 Kubernetes期望可以实现通过监测Pod的使用情况&#xff0c;实现pod数量的自…

如何通过 CRM 系统实现医药企业的一体化、数字化管理

医药企业面临着复杂的市场环境和严格的监管要求。传统管理方式下&#xff0c;销售、市场、客户服务等部门之间信息流通不畅&#xff0c;数据分散&#xff0c;导致工作效率低下&#xff0c;客户体验差。例如&#xff0c;销售团队可能不了解市场部门最新的推广活动&#xff0c;无…

大龄离异单身女性网上找陪伴搭子一起搭伙过生活的自救经历分享

在繁忙的都市生活中&#xff0c;李梅是一个独立自主的大龄离异女性。经历了婚姻的失败后&#xff0c;她更加珍惜自己的生活空间与时间&#xff0c;同时也渴望能够找到一个可以相互扶持、共度余生的伴侣。网络成为了她的新尝试领域&#xff0c;在这里&#xff0c;她希望能够遇到…

php语法学习

启动php 进入软件 打开文件&#xff1a;编写代码 $php true; $java false; var_dump($php);//输出变量细节 var_dump($java) 字符串 注意可以使用双引号也可以使用单引号 测试 $php "最好学web语言"; $java 脱胎于c语言; var_dump($php);//输出变量细节 var…

spark统一内存模型 详解

Apache Spark 是一个用于大规模数据处理的分布式计算框架&#xff0c;它支持多种处理模型&#xff08;如批处理、流处理、SQL、机器学习等&#xff09;。为了高效地在分布式环境中处理这些多样化的工作负载&#xff0c;Spark 在 2.x 版本后引入了统一内存管理模型&#xff0c;以…

配置适合Gurobi的机器硬件环境需要考虑的因素

在使用 Gurobi 进行优化计算时&#xff0c;合适的机器配置能够显著提升其求解性能&#xff0c;如何选择合适的硬件配置&#xff0c;主要从以下三个关键因素进行考虑&#xff1a; 1. CPU 主频和内存通道数 CPU 主频&#xff08;Clock Rate&#xff09; 是指处理器每秒钟能够执…

400行程序写一个实时操作系统(十三):调度器对象的创建与启动第一个任务

前言 调度器是整个RTOS的核心&#xff0c;在前面我们得到了调度器对象的框架图&#xff0c;并且简单介绍了调度器的原理。 在本节中&#xff0c;我们将会初始化调度器并且启动第一个任务。 本节内容需要一定的arm架构功底才能完全看懂&#xff0c;但是ARM架构只是RTOS这片大…

基于AI识别数据的Vue.js图像框选标注

在数字化时代&#xff0c;图像识别技术的应用越来越广泛&#xff0c;尤其是在车牌识别、人脸识别等领域。本文将介绍如何使用Vue.js框架和JavaScript创建一个交互式组件&#xff0c;该组件不仅允许用户在图片上绘制多个区域&#xff0c;加载文字&#xff0c;还提供了清空功能。…

leetcode-71-简化路径

题解&#xff1a; 1、以"/"作为分隔符对字符串进行分割得到数组names; 2、初始化一个栈stack&#xff08;python中的栈使用列表实现&#xff09;&#xff1b; 3、遍历数组names&#xff1b;如果当前元素为".."且栈不为空&#xff0c;则将弹出栈顶元素&a…

不考虑光影、背景、装饰,你的可视化大屏摆脱不了平淡。

如果在可视化大屏的设计中不考虑光影、背景和装饰&#xff0c;确实难以摆脱平淡。光影效果可以为大屏增添立体感和层次感&#xff0c;吸引观众的注意力。 合适的背景能营造出特定的氛围&#xff0c;使数据展示更具情境感。而装饰元素则可以起到点缀和美化的作用&#xff0c;提…

无人机悬停精度算法!

一、主要算法类型 PID控制算法&#xff1a; PID控制算法是一种常用的闭环控制算法&#xff0c;通过计算目标值与当前值的误差&#xff0c;并根据比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;、微分&#xff08;D&#xff09;三个参数来调整控制输出&#x…

049_python基于Python的热门微博数据可视化分析

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…