主题
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)验证方法:
- 先只解开内网那两段(
192.168.0.238),日志应打出页面正文;把该 IP 改成一个不存在的地址,应打印nil。 - 最后三行不用解开:直接下载运行,按原脚本会打印一个整数(错误码),用上面修正版则打印字节数与正文 —— 这个对比能直接证实回调参数顺序。
- 外网段(
www.baidu.com)需要设备已接入能出外网的网络,否则只会拿到失败。
注意事项:
- 把同步
http.get放在timer.start回调里:整个 Lua 事件循环会卡在请求上,定时器、串口、MQTT 回调全部暂停(见本页注意事项)。 - 异步回调只写一个形参,误以为拿到的是数据(实际是错误码)。
- 解开内网那两段时设备与
192.168.0.238不在同一网段,print(s)永远打印nil,容易误判成「HTTP 模块不可用」。