nginx for lua api之获取请求中的参数

一、通过url获取

1、通过分析url中的规则获取(类似于分析请求路由)

其实是通过在ngx中分析url,将url中的代表特殊含义的部分设置一个自定义是变量中,再通过ngx.var.变量名获取

例如:新闻的详情页面,可能是http://localhost:8000/detail/12345.html

这个12345可能代表的是新闻的ID,那么:

nginx配置中可以这么写:

  1. location /detail/([a-zA-Z0-9-_]+) {
  2. default_type text/html;
  3. set $news_id $1;
  4. content_by_lua_file /data/www/orproject/news.lua
  5. }

在lua文件(news.lua)中可以这么获取:

  1. local news_id = ngx.var.news_id
  2. ngx.say(news_id)
  3. ngx.say(ngx.var.uri)

当然我们也可以通过分析当前uri(ngx.var.uri)来分析出news_id,不过通过本方法更加便利

2、通过分析url中的查询字符串获取

所谓查询字符串就是url中?后面的那一段,通过这些方式可以在url中传参

(1)通过nginx中的预定义变量获取
  • 在nginx中通过arg_NAME可以获取参数名为NAME的值,如/news/detail?id=122,那么我们可以通过arg_id来获取这个参数id的值

  • 在openresty中通过ngx.var.arg_NAME即可获取参数名为NAME的值,如ngx.var.arg_id

(2)通过API中的ngx.req.get_uri_args()

这将获取一个参数的table,如:

  1. local args = ngx.req.get_uri_args()
  2. ngx.say(args.id)

二、通过请求数据获取

1、获取GET请求参数:ngx.req.get_uri_args()

如一个uri:http://localhost:8000/var?username=shixinke&uid=1000

  1. local args = ngx.req.get_uri_args()
  2. ngx.say(args.username)
  3. ngx.say(args["username"])
  4. ngx.say(args.uid)
  5. ngx.say(args["uid"])
2、获取POST请求参数
(1)ngx.req.get_body_data()

得到的是一个字符串

如:

通过CURL来模拟:

  1. curl -d "id=10000&name=shixinke" http://localhost:8000/post

nginx配置:

  1. location /post {
  2. default_type text/html;
  3. content_by_lua_file $web_root/api/post.lua;
  4. }

lua代码:

  1. ngx.req.read_body()
  2. local str = ngx.req.get_body_data()
  3. ngx.say("str:"..str);

输出:str:id=10000&name=shixinke

(2)ngx.req.get_post_args()

得到的是一个table

还是使用上面的例子:

lua代码:

  1. ngx.req.read_body()
  2. local data = ngx.req.get_post_args()
  3. for key, value in pairs(data) do
  4. ngx.say("key="..key..";value="..value..";")
  5. end

输出:

key=name;value=shixinke;

key=id;value=10000;

注:在获取post请求的参数前,需要使用ngx.req.read_body()表示读取请求体内容(post请求中,请求参数在请求体中)