openresty使用Lua开发简单功能页面
本文章记录使用lua开发简单API功能页.
前言
开发过程中遇到一些特别简单的接口需求,但是单独写一个api接口页面又很麻烦的需求,这个时候可以借助lua来实现.
思路
将简单api功能模块化,统一存放某个路径.
调用时判断模块是否存在,否则返回404.
架构
实现根据字符串加载模块
utils/tools.lua
Tools = { _VERSION = "0.1" }
-- 字符切割
function Tools:split(s, p)
local rt = {}
string.gsub(s, '[^' .. p .. ']+', function(w)
rt[#rt + 1] = w
end)
return rt
end
-- 返回404
function Tools:page_not_found(message)
local message = message or "not found."
ngx.say(message)
ngx.exit(404)
end
-- 获取包
function Tools:get_pack(module_name)
local file_path = package.searchpath(module_name, package.path, '.', '/')
if not file_path then
return nil
end
local loader = loadfile(file_path)
return loader
end
-- 加载包或直接返回404
function Tools:require(modname)
if not package.loaded[modname] then
local loader = self:get_pack(modname)
if loader then
local module = loader(modname)
return module
else
self:page_not_found(modname..' pack not found.')
end
end
return package.loaded[modname]
end
return Tools
root.lua
ngx = ngx
Tools = require("utils.tools")
local paga_name = Tools:split(ngx.var.request_uri, '/')[2]
if paga_name == nil then
Tools:page_not_found("page not found.")
end
Tools:require("page/"..paga_name).main()
截取URL,判断page目录下功能模块是否存在,如果存在直接实例化main,否则返回404页面.
配置
server {
listen 80;
server_name xxxx;
location /page {
access_by_lua_file lua/root.lua;
}
# ...
}
功能页
page/ping.lua
用于监控心跳检测
_M = {}
function _M:main()
ngx.say('pong')
end
return _M
请求: curl http://localhost/page/ping 返回: pong
page/info.lua
实现页面查询Redis某个值
_M = {}
function _M:main()
local query_string = ngx.req.get_uri_args()
-- GET请求 info参数
if query_string.info then
local info_value = Redis:get(query_string.info)
if info_value == ngx.null then
Tools:page_not_found("info not found.")
end
ngx.say(info_value)
end
end
return _M
请求: curl http://localhost/page/info/?info=test 返回: test value / 404