HTTP(超文本传输协议)
# 简介
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS,所以HTTPS相关的指令只需要参考SSL部分配置连接,其他和http都是一样的。
# API说明
http的API在LuatOS-Air lib有做封装,建议直接用lib的API接口。
|API接口| 描述|
| --- | --- |
| http.request()|发起http请求|
> 详细的API介绍见[http API章节](https://doc.openluat.com/wiki/21?wiki_page_id=2274)
# 实现流程
通过调用功能强大的http.request(),发送HTTP请求即可
```lua
http.request(method, url, cert, head, body, timeout, cbFnc, rcvFileName)
```
参数详细说明参考上面连接[http API章节]说明。
# 示例
相关实例程序在脚本库的demo\http文件夹下,此文只是摘抄其中一个实例,可以根据实际需要对demo其它内容进行研究。
## 执行HTTP请求的回调函数
result:true或者false,true表示成功收到了服务器的应答,false表示请求发送失败或者接收服务器应答失败
prompt:string类型,result为true时,表示服务器的应答码;result为false时,表示错误信息
head:table或者nil类型,表示服务器的应答头;result为true时,此参数为{head1="value1", head2="value2", head3="value3"},value中不包含\r\n;result为false时,此参数为nil
body:string类型,表示接收到的应答实体数据
```lua
local function cbFnc(result,prompt,head,body)
log.info("testHttp.cbFnc",result,prompt)
if result and head then
for k,v in pairs(head) do
log.info("testHttp.cbFnc",k..": "..v)
end
end
if result and body then
log.info("testHttp.cbFnc","bodyLen="..body:len())
end
end
```
## HTTP请求函数
"GET",HTTP请求方法
"www.lua.org",HTTP请求url
cbFnc,执行HTTP请求的回调函数(请求发送结果以及应答数据接收结果都通过此函数通知用户)
```lua
http.request("GET","www.lua.org",nil,nil,nil,nil,cbFnc)
```
# 常见问题
## 是否支持HTTPS
支持,TLSV1.2
## 为什么频繁请求会失败
支持的http连接总数有限,最多支持10个连接,包括lib库的连接
## 为什么POST JSON格式的数据会出现失败
参考http的demo,在head参数中传入{[“Content-Type”]=“application/json”}
## 数据接收缓存问题
有如下两种缓存机制, http.request接口可以设置使用何种缓存机制,http的demo中有详细示例可供参考
1) 内存缓存:内存中有一个缓冲区,在项目剩余可用内存的范围内,此缓冲区没有大小限制,例如项目可用内存剩余200KB,则此缓冲区的理想最大值是200KB;收到的数据都会缓存到此缓冲区,如果收到的数据超过缓冲区大小,会导致内存不足重启;数据接收完整后,通过回调函数传出缓冲区数据,供用户应用脚本使用
注意:缓冲区位于内存中,断电或者重启后,缓冲区中的数据会被清空;如果接收的数据过多,不建议使用内存缓存的机制,可能会导致内存不足重启
2) 文件缓存:接收到的数据可以保存在文件中,在文件系统剩余空间的范围内,此文件没有大小限制,例如项目剩余文件系统空间200KB,则此文件的理想最大值是200KB;收到的数据都会保存到此文件中,如果收到的数据文件最大值,会导致保存失败,新数据被丢弃;数据接收完整后,通过回调函数传出文件完整路径,供用户应用脚本使用
注意:文件位于文件系统中,断电或者重启后,文件不会被自动清空删除;如果文件已经不再使用,一定要通过os.remove接口将文件删除。否则会一直占用文件系统空间,导致可用文件系统空间变小
## body为nil或者为{}时注意事项:
当body为空或者为{}时,要指定head参数,例如Content-Lenth=0
## 请问有没有办法log下来所有4g上行下行的流量?我通过http传送一些数据到主站,实际信息只有几十K,但是耗的流量好几兆了。我想抓包分析一下流量,有没有简单的办法?
1. 确认RNDIS有没有关闭[如何禁用RNDIS功能](https://doc.openluat.com/wiki/21?wiki_page_id=2010#RNDIS_18 "如何禁用RNDIS功能")
2. 禁用掉RNDIS网卡然后抓包分析 [如何统计流量](https://hmi.wiki.luatos.com/doc/65042949/e6zPC3k9/t0ofut80#nav_17 "如何统计流量")
## http函数是长连接吗?
不是长连接