简介
最近项目接触到Openwrt的编译和使用,op本身是一个定制的linux系统,兼容的包和语言也有很多,随着物联网的发展,相信在路由器方面的应用会越来越多,lua、shell本身是小巧并且适用于运行在小内存机子上的脚本语言,而lua的速度和使用更偏向于面向对象的高级语言,所以暂时选择lua来配置路由器以及访问远程api对数据进行交互。
OpenWrt上使用lua库
- op已经支持lua,但是如果要用到其他库比如 http socket等需要进行安装:
//opkg 类似于ubuntu apt-get ,是openwrt的包管理器
opkg update
//Luarocks 是Lua的包管理器
opkg instsall luarocks
// 安装luasocket
luarocks install luasocket
- 安装luasocket之后可以直接用require进行引用,下面贴出GET和POST的方法
lua的语法和返回值,如果是https的访问需要应用"ssl.https"
local http=require("socket.http")
local https = require("ssl.https")
local ltn12 = require("ltn12")[](http://jianshu.io)
local json = require ("dkjson")
local response_body = {}
local res, code, headers = https.request{
url = "https://api.abc.com/abc",
method = "GET",
headers =
{
--我在项目中使用oauth进行api连接,所以加上了authorization
["Authorization"] = "Bearer a4543f57fad1031d4815764620e094bfe6c80497"
},
sink = ltn12.sink.table(response_body)}
}
local postdata = --table格式的数据
local response_body = {}
local request_body = json.encode (postdata, { indent = true })
local res, code, headers = https.request{
url = "https://api.abc.com/abc",
method = "POST",
headers =
{
["Authorization"] = "Bearer a4543f57fad1031d4815764620e094bfe6c80497"
["Content-Type"] = "application/json";
["Content-Length"] = request_body:len();
},
source = ltn12.source.string(request_body),
sink = ltn12.sink.table(response_body)
}
- 使用dkjson对数据进行解析示例
官网有使用示例:dkjson下载地址
接上文代码的示例:
--api返回json数据的解析
if type(response_body) == "table" then
local res = table.concat(response_body)
local obj, pos, err = json.decode (res, 1, nil)
if err then
print ("Error:", err)
else
print ("key1", obj.key1)
end
else
print("Not a table:", type(response_body))
end
--table 转json格式
local tabledata = --table格式的数据
local jsondata = json.encode (tabledata, { indent = true })
print(jsondata)