简单API Server框架

前面关于OpenResty基本功能的部分说了很多,现在就是实践的时刻了,我们这里只做一个简单的api框架:计算加减乘除。

基于location的基本api就不在这里演示了,我们直接使用典型的方法,首先我们编写逻辑部分,这里将四则运算分为四个文件:

--========== {$prefix}/lua/addition.lua
local args = ngx.req.get_uri_args()
ngx.say(args.a + args.b)

--========== {$prefix}/lua/subtraction.lua
local args = ngx.req.get_uri_args()
ngx.say(args.a - args.b)

--========== {$prefix}/lua/multiplication.lua
local args = ngx.req.get_uri_args()
ngx.say(args.a * args.b)

--========== {$prefix}/lua/division.lua
local args = ngx.req.get_uri_args()
ngx.say(args.a / args.b)

我们知道nginx处理请求是分阶段的,所以,我们先要在access阶段对参数进行验证,在content阶段对数据进行计算。

local args = ngx.req.get_uri_args()

local function check_is_number(...)
    local args = {...} or {}
    local num
    for _, v in ipairs(args) do
        num = tonumber(v)
        if nil == num then
            return false
        end
    end
    return true
end

if not args.a or not args.b or not check_is_number(args.a, args.b) then
    ngx.say(ngx.HTTP_BAD_REQUEST)
    return
end

最后,我们配置location参数:

worker_processes  1;
error_log logs/error.log info;

events {
    worker_connections 1024;
}

http {

    log_format myformat '$remote_addr $status $time_local';
    access_log logs/access.log myformat;

    server {
        listen 8080;
        charset utf-8;

        location ~ ^/api/([-_a-zA-Z0-9/]+) {
            access_by_lua_file lua/check.lua;
            content_by_lua_file lua/api/$1.lua;
        }
    }
}

这里使用$1参数对lua文件进行匹配,这样做需要确认api下的文件都是可被调用的,以免造成安全隐患。