【发布时间】:2015-02-25 13:55:31
【问题描述】:
我正在尝试使用 nginx 和 lua 编写一个 REST 接口。我想知道的是,检查请求方法的最佳方法是什么?如果是 GET,我需要查询一个 db。如果是 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 代码的任何提示?
【问题讨论】:
-
只需与
'GET'字符串比较。If是邪恶的,但有时仍然比其他任何东西都好。你有很不自然的例子。你真正想做什么? -
它有什么不自然的地方?你能扩展吗?我全神贯注,因为我只是 nginx 的新手。现在的代码只是测试代码,但话虽如此,检查请求类型是很正常的,不是吗?然后我唯一的其他逻辑是解析输入
-
@AlexeyTen。我知道我可以将它与字符串 GET 进行比较,但我想我想知道是否有另一种方法,比如使用一些现有的常量,我只是不熟悉。
-
我的意思是,检查请求方法不是目标,而是做其他事情的一种方式。如果您解释真正的问题是什么会更好。可能有更简单,更清洁的方法来解决它。
-
GET是常数。您应该与之比较的确切三个字节