在nginx_lua中检查请求方法的正确方法

我正在尝试使用nginx和lua编写REST接口。我想知道的是,检查请求方法的最佳方法是什么?如果它是GET,则需要查询数据库。如果是POST或DELETE,则需要运行另一个lua脚本来更新数据库。

到目前为止,这是我用来测试请求方法的代码:

    #curl-i-X GET'http://localhost/widgets/widget?name = testname&loc = 20000'-H“Accept:application / json”
    位置/小部件/小部件{
            default_type“text / pain”;
            #ifisEvil...除非在lua内完成
            content_by_lua '
                    ngx.say(“请求是:”,ngx.var.request_method)
                    ngx.say(“常量是:”,ngx.HTTP_GET)
                    -ngx.say(“类型是:”,type(ngx.HTTP_GET))

                    如果ngx.var.request_method == ngx.HTTP_GET then
                            local args = ngx.req.get_uri_args()
                            for key,val in pairs(args)do
                                    如果val的类型==“表”则
                                            ngx.say(key,“:”,table.concat(val,“,”))
                                    否则
                                            ngx.say(key,“:”,val)
                            end
                    end
            ';

    }

输出结果如下:

mytestdevbox2:/var/www/nsps2# curl -i -X GET 'http://localhost/widgets/widget?name=testname&loc=20000' -H "Accept:application/json"
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Wed, 25 Feb 2015 13:44:11 GMT
Content-Type: text/pain
Transfer-Encoding: chunked
Connection: keep-alive

request is:GET
the constant is:2
mytestdevbox2:/var/www/nsps2#

以上输出解释了为什么if语句失败了……因为我将“GET”与2进行比较。如果已经可用并且我只是漏了什么,我宁愿不自己编写常量列表。

我知道有一个名为“$ request_method”的nginx变量,但我不想使用它,因为我希望将所有逻辑保留在lua中。据我所知,使用nginx中的“if”语句是邪恶的!

因此,我尝试坚持lua代码。

有没有关于我可能搞砸lua代码的提示?

点赞
用户2693875
用户2693875

Lua的方法常量,比如ngx.HTTP_GET,根据其文档主要用于ngx.location*调用。

因此,在Lua中检查方法的“更好的”方式就是将其与GET和其他的方法字符串进行比较。

然而,我会认真考虑在nginx级别使用“邪恶”的if,根据方法拆分您的请求。

这样做的好处是允许您为每种方法配置单独的日志记录、错误处理等。

2015-02-25 22:38:14