Skip to content

HTTP 客户端例程 4:现场常用脚本 http.LPLUA(原文) ​

这一页只讲这一个例程。同组其余例程、以及这个库的函数说明都在 05-01-http。

适用:同上 | 依赖模块:http | 难度:★☆☆

场景:一份把 HTTP 所有入口都写一遍的「查手册型」脚本:同步 get/post、对象模式、异步 get_asy、 主动释放对象全部齐了,只是每段都用长注释包着,要看哪种用法就解开哪段(文件 http.LPLUA),原文收录如下。

完整代码(http.LPLUA 原文):

lua
--[[s=http.post("http://192.168.0.238/index.html","xxxxx")
print(s)--]]
--system.sleep(5000)
--[[s=http.get("http://192.168.0.238/index.html")
print(s)--]]
--[[s=http.get("http://www.baidu.com/index.html")
print(s)--]]
--s=http.creat("http://www.baidu.com/index.html")
--print(s:post("xx"))
--s=nil--不再使用HTTP对象
--collectgarbage("collect")--回收内存
--[[s=http.post("http://www.baidu.com/index.html","")
print(s)--]]
x=http.creat("http://www.baidu.com/index.html")
http.get_asy(x,"http://www.baidu.com/index.html",function(msg)
		print(msg)
	end
)

要点:

  • 每段外面的 --[[ … --]] 是成对的长注释(Lua 的长注释以 ]] 结束),用来「整段封存、解开就能跑」;真正活着的只有最后三行。
  • 同步 http.get(url) / http.post(url, body) 成功返回响应正文,失败返回 nil 加一条错误文字,所以直接 print(s) 就能同时看到内容和失败。
  • http.creat(url) 只是给对象预设一个 URL;后面 s:post("xx") 用的就是这个预设地址。
  • http.get_asy(x, url, cb) 这里的「点号写法」把对象 x 作为第一个参数递进去,与 x:get_asy(url, cb) 完全等价,不要以为是两个不同的接口。
  • ⚠ 原脚本回调只接了一个 msg:get_asy 的回调签名是 (errcode, data, datalen),所以 print(msg) 打印的是错误码(0 才是成功),页面正文在第二个参数里、这份脚本把它丢了。
  • 注释里的 s=nil + collectgarbage("collect") 是主动释放 HTTP 对象的示范:只在确定请求已经回来、不再用这个对象时才这么写,请求在途时被回收会丢响应。

拿到正文的写法(修正上面那个回调):

lua
x = http.creat("http://www.baidu.com/index.html")
x:get_asy("http://www.baidu.com/index.html", function(errcode, data, datalen)
    if errcode == 0 then
        print("收到", datalen, "字节:", data)
    else
        print("请求失败 err=", errcode)
    end
end)

验证方法:

  1. 先只解开内网那两段(192.168.0.238),日志应打出页面正文;把该 IP 改成一个不存在的地址,应打印 nil。
  2. 最后三行不用解开:直接下载运行,按原脚本会打印一个整数(错误码),用上面修正版则打印字节数与正文 —— 这个对比能直接证实回调参数顺序。
  3. 外网段(www.baidu.com)需要设备已接入能出外网的网络,否则只会拿到失败。

注意事项:

  • 把同步 http.get 放在 timer.start 回调里:整个 Lua 事件循环会卡在请求上,定时器、串口、MQTT 回调全部暂停(见本页注意事项)。
  • 异步回调只写一个形参,误以为拿到的是数据(实际是错误码)。
  • 解开内网那两段时设备与 192.168.0.238 不在同一网段,print(s) 永远打印 nil,容易误判成「HTTP 模块不可用」。

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研