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函数是长连接吗? 不是长连接