0
点赞
收藏
分享

微信扫一扫

如何实现API网关之Lua入门

你的益达233 2022-02-13 阅读 128
lua

构建Lua项目环境

LuaJIT是相对于Lua更为主流的存在
在IDEA中加入EmmyLua插件即可使用,
idea运行lua脚本

上手写代码

基础语法

可以参考下面的资料 Lua入门参考

打印函数

  • print
  • 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网关了,我的最终目的是写一个反爬系统,感兴趣的朋友可以点个关注,我会持续更新。

举报

相关推荐

0 条评论