使用 nginx httpluamodule 的 REST 接口
REST interface using nginx httpluamodule
我刚刚开始使用 nginx 和 HttpLuaModule。我已经创建了一个测试配置文件来熟悉它是如何工作的。
现在我正在尝试编写一些逻辑来接受对特定类型资源的 GET、POST 和 DELETE 请求。
我想创建一个 "location" 匹配以下 URI 的条目/接受以下 curl 调用:
curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000 -H "Accept:application/json"
这是我现在的 nginx.conf 的样子:
server {
listen 80;
server_name nsps2;
root /var/www/;
index index.html index.htm;
#charset koi8-r;
#access_log logs/host.access.log main;
#curl http://localhost/hello?name=johndoe
location /hello {
default_type "text/plain";
content_by_lua '
local rquri = ngx.var.request_uri;
ngx.say("the uri is ", rquri ,".")
local name = ngx.var.arg_name or "Anonymous"
ngx.say("Hello, ", name, "!")
';
}
location / {
root /var/www/;
index index.html index.htm;
}
#curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000 -H "Accept:application/json"
location /widgets/widget {
root /var/www/widgets;
default_type "text/pain";
content_by_lua '
local arga,argb = ngx.arg[1], ngx.arg[2] ;
ngx.say("the arga is ", arga ,".")
ngx.say("the argb is ", argb, ".")
';
}
使用最后一个 "location" 条目,我正在尝试
1.证明系统正在获取GET请求
2. 证明我了解如何访问通过 GET 请求传入的参数。
我现在收到如下所示的错误:
2015/02/24 20:18:19 [error] 2354#0: *1 lua entry thread aborted: runtime error: content_by_lua:2: API disabled in the context of content_by_lua*
stack traceback:
coroutine 0:
[C]: in function '__index'
content_by_lua:2: in function <content_by_lua:1>, client: 127.0.0.1, server: nsps2, request: "GET /widgets/widget?name=testname?loc=20000 HTTP/1.1", host: "localhost"
我不太确定此错误的含义/试图告诉我的含义。
任何提示将不胜感激。
谢谢。
编辑 1
我认为问题是语法错误。我正在阅读手册并找到了一个示例来尝试。我已将代码更改为如下所示:
location /widgets/widget {
default_type "text/pain";
content_by_lua '
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
';
}
现在当我这样调用应用程序时:
mytestdevbox2:/var/www/nsps2# curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000 -H "Accept:application/json"
-ash: -H: not found
mytestdevbox2:/var/www/nsps2# HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Tue, 24 Feb 2015 21:32:44 GMT
Content-Type: text/pain
Transfer-Encoding: chunked
Connection: keep-alive
name: testname
[1]+ Done curl -i -X GET http://localhost/widgets/widget?name=testname
系统显示 "name: testname" 后,它就一直呆在那里,直到我点击 "enter"。在我这样做之后,它会继续显示 1+ 内容。
我不太确定它在做什么。
编辑 2:
向 curl 调用添加引号确实解决了问题:
mytestdevbox2:/var/www/nsps2# curl -i -X GET 'http://localhost/widgets/widget?name=testname&loc=20000'
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Wed, 25 Feb 2015 12:59:29 GMT
Content-Type: text/pain
Transfer-Encoding: chunked
Connection: keep-alive
loc: 20000
name: testname
mytestdevbox2:/var/www/nsps2#
EDIT 1
中描述的问题与您关于nginx的问题没有任何关系,是由于您在执行命令时没有引用curl的参数造成的:
curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000
这是作为用'&'分隔的两个命令执行的:curl -i -X GET http://localhost/widgets/widget?name=testname
和loc=20000
;这就是为什么您在收到提示后看到输出的原因,因为第一个命令现在在后台执行。 “1+ Done”消息是对后台进程终止的确认;它只是在您按 Enter 后显示。
将 URL 和查询字符串括在引号中,您应该会看到预期的行为。
我刚刚开始使用 nginx 和 HttpLuaModule。我已经创建了一个测试配置文件来熟悉它是如何工作的。
现在我正在尝试编写一些逻辑来接受对特定类型资源的 GET、POST 和 DELETE 请求。
我想创建一个 "location" 匹配以下 URI 的条目/接受以下 curl 调用:
curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000 -H "Accept:application/json"
这是我现在的 nginx.conf 的样子:
server {
listen 80;
server_name nsps2;
root /var/www/;
index index.html index.htm;
#charset koi8-r;
#access_log logs/host.access.log main;
#curl http://localhost/hello?name=johndoe
location /hello {
default_type "text/plain";
content_by_lua '
local rquri = ngx.var.request_uri;
ngx.say("the uri is ", rquri ,".")
local name = ngx.var.arg_name or "Anonymous"
ngx.say("Hello, ", name, "!")
';
}
location / {
root /var/www/;
index index.html index.htm;
}
#curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000 -H "Accept:application/json"
location /widgets/widget {
root /var/www/widgets;
default_type "text/pain";
content_by_lua '
local arga,argb = ngx.arg[1], ngx.arg[2] ;
ngx.say("the arga is ", arga ,".")
ngx.say("the argb is ", argb, ".")
';
}
使用最后一个 "location" 条目,我正在尝试 1.证明系统正在获取GET请求 2. 证明我了解如何访问通过 GET 请求传入的参数。
我现在收到如下所示的错误:
2015/02/24 20:18:19 [error] 2354#0: *1 lua entry thread aborted: runtime error: content_by_lua:2: API disabled in the context of content_by_lua*
stack traceback:
coroutine 0:
[C]: in function '__index'
content_by_lua:2: in function <content_by_lua:1>, client: 127.0.0.1, server: nsps2, request: "GET /widgets/widget?name=testname?loc=20000 HTTP/1.1", host: "localhost"
我不太确定此错误的含义/试图告诉我的含义。 任何提示将不胜感激。
谢谢。
编辑 1
我认为问题是语法错误。我正在阅读手册并找到了一个示例来尝试。我已将代码更改为如下所示:
location /widgets/widget {
default_type "text/pain";
content_by_lua '
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
';
}
现在当我这样调用应用程序时:
mytestdevbox2:/var/www/nsps2# curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000 -H "Accept:application/json"
-ash: -H: not found
mytestdevbox2:/var/www/nsps2# HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Tue, 24 Feb 2015 21:32:44 GMT
Content-Type: text/pain
Transfer-Encoding: chunked
Connection: keep-alive
name: testname
[1]+ Done curl -i -X GET http://localhost/widgets/widget?name=testname
系统显示 "name: testname" 后,它就一直呆在那里,直到我点击 "enter"。在我这样做之后,它会继续显示 1+ 内容。 我不太确定它在做什么。
编辑 2:
向 curl 调用添加引号确实解决了问题:
mytestdevbox2:/var/www/nsps2# curl -i -X GET 'http://localhost/widgets/widget?name=testname&loc=20000'
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Wed, 25 Feb 2015 12:59:29 GMT
Content-Type: text/pain
Transfer-Encoding: chunked
Connection: keep-alive
loc: 20000
name: testname
mytestdevbox2:/var/www/nsps2#
EDIT 1
中描述的问题与您关于nginx的问题没有任何关系,是由于您在执行命令时没有引用curl的参数造成的:
curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000
这是作为用'&'分隔的两个命令执行的:curl -i -X GET http://localhost/widgets/widget?name=testname
和loc=20000
;这就是为什么您在收到提示后看到输出的原因,因为第一个命令现在在后台执行。 “1+ Done”消息是对后台进程终止的确认;它只是在您按 Enter 后显示。
将 URL 和查询字符串括在引号中,您应该会看到预期的行为。