http
一、应用场景
HTTP 在如下的场景,开发成本是最低的:
1,终端和云端交换文件,不用开发复杂的分包组包协议;
2,跟云端下载和提交各种参数, 不用设计报文协议,用http 的参数即可,非常方便。
二、核心功能与用法
示例:
-- 使用http库,需要引入sysplus库, 且需要在task内使用
require "sys"
require "sysplus"
sys.taskInit(function()
sys.wait(1000)
local code,headers,body = http.request("GET", "http://www.example.com/abc").wait()
log.info("http", code, body)
end)
http.request(method,url,headers,body,opts,ca_file,client_ca, client_key, client_password)
http 客户端
参数:
传入值类型 | 解释 |
string | 请求方法, 支持 GET/POST 等合法的HTTP方法 |
string | url地址, 支持 http和https, 支持域名, 支持自定义端口 |
tabal | 请求头 可选 例如 |
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认证才需要 |
返回值:
返回值类型 | 解释 |
int | code , 服务器反馈的值>=100, 最常见的是200.如果是底层错误,例如连接失败, 返回值小于0 |
tabal | headers 当code>100时, 代表服务器返回的头部数据 |
string/int | body 服务器响应的内容字符串,如果是下载模式, 则返回文件大小 |
例子:
--[[code报错信息列表:
-1 HTTP_ERROR_STATE 错误的状态, 一般是底层异常,请报issue
-2 HTTP_ERROR_HEADER 错误的响应头部, 通常是服务器问题
-3 HTTP_ERROR_BODY 错误的响应体,通常是服务器问题
-4 HTTP_ERROR_CONNECT 连接服务器失败, 未联网,地址错误,域名错误
-5 HTTP_ERROR_CLOSE 提前断开了连接, 网络或服务器问题
-6 HTTP_ERROR_RX 接收数据报错, 网络问题
-7 HTTP_ERROR_DOWNLOAD 下载文件过程报错, 网络问题或下载路径问题
-8 HTTP_ERROR_TIMEOUT 超时, 包括连接超时,读取数据超时
-9 HTTP_ERROR_FOTA fota功能报错,通常是更新包不合法]]
-- GET请求local code, headers, body = http.request("GET","http://site0.cn/api/httptest/simple/time").wait()
log.info("http.get", code, headers, body)
-- POST请求local code, headers, body = http.request("POST","http://httpbin.com/post", {}, "abc=123").wait()
log.info("http.post", code, headers, body)
-- GET请求,但下载到文件local code, headers, body = http.request("GET","http://httpbin.com/", {}, "", {dst="/data.bin"}).wait()
log.info("http.get", code, headers, body)
-- 自定义超时时间, 5000ms
http.request("GET","http://httpbin.com/", nil, nil, {timeout=5000}).wait()
-- 分段下载local heads = {["Range"] = "bytes=0-99"} --下载0-99之间的数据
http.request("GET","http://httpbin.air32.cn/get", heads, nil, {timeout=5000}).wait()
三、常见问题排查
3.1 如何排查 https 无法访问的问题
下面说明的是如何排查 https 的无法访问的情况, 分多个步骤, 逐段排查。
步骤 A, 要先确认模组能不能联网
1. 先确认模组能不能联网,若能联网,需要提供图片及日志
2. 证据有: luatools 的主界面截图, 日志里 IP_READY, socket 连接成功, 基站时间下发的日志
无法联网的解决方向:
(1)换手机卡, 换不同的手机卡
(2)注意模组支持频段, 例如海外模组在国内经常连不上
(3)如果是专网卡, 而且必须设置APN的, 参考 demo/mobile 对专网卡的描述
已经确认模组联网正常, 就继续步骤 B
步骤 B, 确认目标网址是不是公网地址, 用电脑浏览器能不能访问
1. 把 URL 放到 Chrome 或者 Firefox/Egde 的地址栏访问一次, 起码不能提示服务器无法连接
2. 打开命令控制台, 也就是 cmd, 或者 powershell, 执行如下指令, 注意 URL 要双引号包起来,但不能带额外的空格
curl -v "https://dev.sykm518.com"
3. 输出的内容里, 找 "HTTP/" 字样, 有出现的才是可以连接, 这个图是能连的, 参数不对等导致非 200 响应码是正常的现象, 恰恰证明服务器能连. https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Status
这个图就是不能连的, 故意写错端口
解决方向:
(1) 如果是公网域名, 公网服务器, 浏览器不能连, 那就是客户给错URL了, 要么防火墙没开, 要么端口或者协议写错
(2) 如果是公网域名, 公网服务器, 浏览器不能连, 但curl可以, 那证明服务器是好的, 继续往下排查
(3) 如果是内网域名, 甚至内网ip, 那可以先去跟客户对线了,除非那是专网卡,专网服务器地址.
确认服务器能连之后, 继续步骤 C
步骤 C, 有些型号能连, 有些型号不能连
1. 打开网址: https://myssl.com/ 用手机验证码登录, 非常重要!!!
2. 输入 URL, 并点击查看
3. 检查结果, 用 "https://myssl.com/dev.sykm518.com?domain=dev.sykm518.com" 为例
基本信息查看, 推荐自己用 合宙域名 百度, 腾讯的域名去测一下, 会有更好的认知
关键的关键 "协议与套件", 需要往下滚动
Air724UG 的 LuatOS-Air 固件, 仅支持 RSA 普通算法, 不支持椭圆算法
Air780E/Air780EPM/Air8101/Air8000 等 LuatOS-SoC 固件, 支持椭圆算法和 RSA 算法
解决方向:
- 如果服务器能改, 那就加上 RSA 算法支持, 不能改就只能换模组了