在 nginx_lua 中检查请求方法的正确方法
proper way to check for request method in 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"
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" 与 2 进行比较。如果它们已经可用,我宁愿不组成我自己的常量列表并且我只是在这里遗漏了一些东西。
我知道有一个名为“$request_method”的 nginx 变量,但我不想使用它,因为我想将所有逻辑保留在 lua 中。到目前为止,根据我的阅读,在 nginx 中使用 "if" 语句是 evil!
所以我试图坚持使用 lua 代码来处理类似的事情。
关于我可能在哪里弄乱我的 lua 代码的任何提示?
Lua的方法常量,如ngx.HTTP_GET
,根据他们的文档,mainly for ngx.location*
calls.
所以没有 "better" 方法可以检查 Lua 中的方法,而不是将它与 GET
和其余方法字符串进行比较。
但是我会认真考虑使用 "evil" if
根据 nginx 级别的方法拆分您的请求。
这给您带来的好处是允许您为每个方法配置单独的日志记录、错误处理等。
我正在尝试使用 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" 与 2 进行比较。如果它们已经可用,我宁愿不组成我自己的常量列表并且我只是在这里遗漏了一些东西。
我知道有一个名为“$request_method”的 nginx 变量,但我不想使用它,因为我想将所有逻辑保留在 lua 中。到目前为止,根据我的阅读,在 nginx 中使用 "if" 语句是 evil!
所以我试图坚持使用 lua 代码来处理类似的事情。
关于我可能在哪里弄乱我的 lua 代码的任何提示?
Lua的方法常量,如ngx.HTTP_GET
,根据他们的文档,mainly for ngx.location*
calls.
所以没有 "better" 方法可以检查 Lua 中的方法,而不是将它与 GET
和其余方法字符串进行比较。
但是我会认真考虑使用 "evil" if
根据 nginx 级别的方法拆分您的请求。
这给您带来的好处是允许您为每个方法配置单独的日志记录、错误处理等。