构建Lua项目环境
LuaJIT是相对于Lua更为主流的存在
在IDEA中加入EmmyLua插件即可使用,
idea运行lua脚本
上手写代码
基础语法
可以参考下面的资料 Lua入门参考
打印函数
- io.write
print("123")
io.write('1234')
循环
循环有两种
- for循环
for i = 1, 10 do
if i % 2 == 0 then
io.write("偶数", i, '\n')
else
io.write('奇数', i, "\n")
end
end
- while循环
a = 1
while true do
if a % 2 == 0 then
io.write("偶数", a, '\n')
else
io.write('奇数', a, "\n")
end
a = a + 1
end
这种语法和Bash shell脚本有点类似,end和then的关键词。
条件
- if - else - end
if a % 2 == 0 then
io.write("偶数", a, '\n')
else
io.write('奇数', a, "\n")
end
- if - elseif - end
if a > 10 and a % 8 == 0 and not (a % 16 == 0) then
break
elseif a > 10 and a % 8 == 0 and (a % 16 == 0) then
io.write(a, "+", '\n')
end
默认数据结构
table,是一种类似于泛型的结构,即里面可以放任何东西, 表示普通数组,符号表,集合,记录,图形,树等,并实现关联数组 。
c = table
table.insert(c,'a')
table.insert(c,'b')
table.insert(c,'c')
print(c[0],c[1],c[2],c[3])
根据实验结果,发现table似乎是默认从偏移量为1开始填充的。换句话说,table本身就是从索引1开始的。
除了table这种复杂结构以外,lua还有一些基础数据类型,如下:
特殊运算符
lua有两个不常见的运算符,分别是字符串连接字符 … 和 取字符串长度字符#
c = 'dsadsadsadsadqewdxadssadsasdsasdsadsad'
d = 'dsarewfdsdsasdad'
print(c..d)
print(#c,#d,#(c..d))
函数
支持定义模板函数
function demo(func, value)
value = value * value
func(value)
end
function demo1(value)
print('-',value,'-')
end
function demo2(value)
print('=',value,'=')
end
demo(demo1,2)
demo(demo2,2)
这里的demo就是模板函数,demo1和demo2就是子函数,子函数可以成为函数的一个参数。
字符串操作
string里面的方法
迭代器
遍历一个数组或者集合都需要迭代器,而lua中提供的迭代器函数为 ipairs,从名字上来看,是一个二元组之类的结构。
OpenResty中的方法
如果在OpenResty和Lua中同时提供的相同的方法,那么一定要使用OpenResty的,因为OpenResty是同步非阻塞的,但是Lua本身的库有可能是阻塞的,会让性能大打折扣。
获取http请求相关的方法
--获取uri
real = ngx.var.uri
--获取参数
local query = ngx.req.get_uri_args()
--获取headers
local headers = ngx.req.get_headers()
--获取cookies
local cookies = ngx.ctx.__cookies__
--获取来源IP
real = ngx.var.remote_addr
--获取UA
real = ngx.var.http_user_agent
--获取方法
local method = ngx.req.get_method()
--获取post参数
ngx.req.read_body()
local post_params, err = ngx.req.get_post_args()
--获取referer
real = ngx.var.http_referer
--获取host
real = ngx.var.host
一些有用的库
- resty.dns.client
- resty.dns.balancer
- resty.http
- resty.jwt
注意事项
- 局部变量使用local关键字来定义。这里也和Python有点像,不过python一般是指定函数变量为全局变量(global),而这里是用local来定义局部变量。
- Lua的函数参数可以是方法,这一点和JS有点相似。
好了,有了Lua的知识和开源API网关的知识,就可以开始写自己的API网关了,我的最终目的是写一个反爬系统,感兴趣的朋友可以点个关注,我会持续更新。