我正在尝试使用nginx和lua编写REST接口。我想知道的是,检查请求方法的最佳方法是什么?如果它是GET,我需要查询数据库。如果它是POST或DELETE,我需要运行另一个lua脚本来更新数据库。 到目前为止,这是我的代码看起来像测试请求方法的内容:
#curl -i -X GET 'http://localhost/widgets/widget?name=testname&loc=20000' -H "Accept:application/json"
location /widgets/widget {
default_type "text/pain";
#ifisEvil... unless done inside lua
content_by_lua '
ngx.say("request is:",ngx.var.request_method)
ngx.say("the constant is:",ngx.HTTP_GET)
--ngx.say("the type is: ", type(ngx.HTTP_GET)
if ngx.var.request_method == ngx.HTTP_GET then
local args = ngx.req.get_uri_args()
for key, val in pairs(args) do
if type(val) == "table" then
ngx.say(key, ": ", table.concat(val, ", "))
else
ngx.say(key, ": ", val)
end
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"如果它们已经可用并且我在这里遗漏了一些东西,我宁愿不编制自己的常量列表。
我知道有一个名为" $ request_method"的nginx变量。但我宁愿不使用它,因为我想把我的所有逻辑保留在lua中。从我到目前为止所读到的,使用" if" nginx中的语句是evil!
所以我试图坚持使用lua代码来做类似的事情。
关于我可能搞砸了我的lua代码的任何提示?
答案 0 :(得分:1)
Lua的方法常量,例如ngx.HTTP_GET
,根据他们的文档mainly for ngx.location*
calls。
所以没有"更好"在Lua中检查方法的方法,而不是将其与GET
和方法字符串的其余部分进行比较。
但是我会认真考虑使用"evil" if
根据nginx级别的方法拆分您的请求。
这使您可以根据方法配置单独的日志记录,错误处理等。