openresty ngx_lua请求响应


openresty ngx_lua请求响应

         

         

                                 

请求头操作

          

ngx.req.set_header:添加、修改请求头

语法格式:ngx.req.set_header(name, value)
* name 如果不存在,表示添加
* name 如果存在,表示修改

使用环境:set_by_lua*、rewrite_by_lua*
     access_by_lua*、content_by_lua*
     header_filter_by_lua*、body_filter_by_lua*

# 示例
ngx.req.set_header(name, "gtlx"):设置单个值
ngx.req.set_header(test, {"1","2"}):使用数组设置多个值

            

ngx.req.clear_header:删除请求头

语法格式:ngx.req.clear_header(name)

使用环境:set_by_lua*、rewrite_by_lua*
     access_by_lua*、content_by_lua*
     header_filter_by_lua*、body_filter_by_lua*

# 示例
ngx.req.clear_header(name):直接删除请求头
ngx.req.set_header(test, nil):通过设置为nil,删除请求头

             

ngx.req.get_headers:获取请求头

语法格式:ngx.req.get_headers(max_headers?, raw?)

使用环境:set_by_lua*、rewrite_by_lua*
     access_by_lua*、content_by_lua*
     header_filter_by_lua*、body_filter_by_lua*

# 示例
location / {

    content_by_lua_block {
        local ngx = require "ngx";

        local headers = ngx.req.get_headers();
        for key,value in pairs(headers) do
            print(key .. value)
        end

        ngx.say(h["name"])    #获取名为name的请求头
                              #等同于:ngx.var.http_name
    }
}

           

              

                                 

请求体操作

         

lua_need_request_body:强制获取请求体,默认不读取

语法格式:lua_need_request_body on|off
* off(默认):表示不读取请求体数据,通过ngx.var.request_body读取的数据为空
* on:开启读取请求体数据,ngx_lua不推荐使用这种方式读取请求体
          
注意事项
* 如果读取的请求体数据超过client_body_buffer_size大小,
  $request_body、ngx.var.request_body读取的数据为空
* client_body_buffer_size、client_max_body_size设置相同,避免出现这种情况

          

ngx.req.read_body:开启读取请求体

语法:ngx.req.read_body()
环境:rewrite_by_lua*、access_by_lua*、content_by_lua*
* 同步读取请求体,且不会阻塞nginx事件循环

            

ngx.req.get_body_file:从临时文件读取请求体数据

语法:file_name = ngx.req.get_body_file()
环境:rewrite_by_lua*、access_by_lua*、content_by_lua*
* 获取存放请求数据的临时文件,并读取数据,以字符串返回
* 尽量控制请求体的大小,避免使用临时文件

            

ngx.req.get_body_data:从内存中读取请求体,返回字符串

语法:data = ngx.req.get_body_data()
环境:rewrite_by_lua*、access_by_lua*、content_by_lua*、log_by_lua*
* 从内存中读取请求体,返回字符串

            

ngx.req.get_post_args:从内存中读取请求数据,以table格式返回

语法:args, err = ngx.req.get_post_args(max_args?)
* 从内存中读取请求体,返回table数据
* max_args表示最多读取的参数个数

环境:rewrite_by_lua*、access_by_lua*、
     content_by_lua*、log_by_lua*、
     header_filter_by_lua*、body_filter_by_lua*

                

                     

                                 

响应头操作

         

ngx.header.headerName:添加、修改、删除响应头

语法:ngx.header.headerName = value、ngx.header["headerName"] = value
* headerName存在,表示修改响应头
* headerName不存在,表示添加响应头
* value设置为nil,表示删除响应头
* ngx.header.test_value = value:输出时,会自动转换为test-value = value

环境:rewrite_by_lua*、access_by_lua*、
     content_by_lua*、log_by_lua*、
     header_filter_by_lua*、body_filter_by_lua*

            

ngx.resp.get_headers:获取响应头

语法:headers = ngx.resp.get_headers(max_headers?, raw?)
* 读取响应头,以table类型返回

环境:rewrite_by_lua*、access_by_lua*、
     content_by_lua*、log_by_lua*、balancer_by_lua*、
     header_filter_by_lua*、body_filter_by_lua*

         

              

                                 

响应体操作

         

ngx.print、ngx.say:异步输出响应体

ngx.flush:强制刷新print、say的内容,转换为同步输出

语法格式:
* ngx.print(...):异步输出,等待内容全部到达缓冲区后输出
* ngx.say(...):异步输出,等待内容全部到达缓冲区后输出
* ngx.flush():强制刷新,flush将之前的内容立刻输出

          

              

                                 

使用示例

         

default.conf

server {
    listen       80;
    server_name  localhost;

    location /test {

        content_by_lua_block {
            ngx.say("hello");
            ngx.sleep(3);
            ngx.say("gtlx");
        }
    }

    location /test2 {
    
        content_by_lua_block {
            ngx.say("hello");
            ngx.flush();
            ngx.sleep(3);
            ngx.say("gtlx 2");
        }
    }

    location /test3 {
    
        content_by_lua_block {
            ngx.say("hello");
            ngx.flush(true);
            ngx.sleep(3);
            ngx.say("gtlx 3");
        }
    }

    #error_page  404              /404.html;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/openresty/nginx/html;
    }

}

          

创建容器

docker run -it -d -p 3000:80 \
-v /Users/huli/lua/openresty/conf7/default.conf:/etc/nginx/conf.d/default.conf \
--name open4 lihu12344/openresty

       

使用测试

# 全部内容等待3s后输出
huli@hudeMacBook-Pro conf7 % curl localhost:3000/test 
hello
gtlx

# hello先输出,gtlx 2等待3s后输出
huli@hudeMacBook-Pro conf7 % curl localhost:3000/test2
hello
gtlx 2

# hello先输出,gtlx 2等待3s后输出
huli@hudeMacBook-Pro conf7 % curl localhost:3000/test3
hello
gtlx 3

        

               

                                 

使用示例 2

         

default.conf

server {
    listen       80;
    server_name localhost;

    location /test {
        client_body_buffer_size 1k;
        client_max_body_size 1k;

        content_by_lua_block {
            ngx.req.read_body()       
            ngx.say(ngx.req.get_body_data())
        }
    }

    location /test2 {
        client_body_buffer_size 1k;
        client_max_body_size 1k;

        content_by_lua_block {
            ngx.req.read_body();

            local args, err = ngx.req.get_post_args();
            if args then
               for key,value in pairs(args) do
                   if type(value) == "table" then
                       ngx.say(key, " ==> ", table.concat(value, " "))
                   else
                       ngx.say(key, " ==> ", value)
                   end
                end
             else
                local file = ngx.req.get_body_file()
                if file then
                   ngx.say("file body", file)
                end
             end
        }
    }

    #error_page  404              /404.html;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/openresty/nginx/html;
    }

}

      

创建容器

docker run -it -d -p 4000:80 \
-v /Users/huli/lua/openresty/conf7/default.conf:/etc/nginx/conf.d/default.conf \
--name open5 lihu12344/openresty

          

***********

使用测试

        

# /test
huli@hudeMacBook-Pro conf7 % curl -i localhost:4000/test -d "test=123&test=234&name=瓜田李下" 
HTTP/1.1 200 OK
Server: openresty/1.21.4.1
Date: Tue, 05 Jul 2022 12:56:50 GMT
Content-Type: application/octet-stream
Transfer-Encoding: chunked
Connection: keep-alive

test=123&test=234&name=瓜田李下

# /test2
huli@hudeMacBook-Pro conf7 % curl -i localhost:4000/test2 -d "test=123&test=234&name=瓜田李下"
HTTP/1.1 200 OK
Server: openresty/1.21.4.1
Date: Tue, 05 Jul 2022 12:56:32 GMT
Content-Type: application/octet-stream
Transfer-Encoding: chunked
Connection: keep-alive

name ==> 瓜田李下
test ==> 123 234

         

get 请求

                 

                 

          

post form数据

                 

                 

            

post json数据

                 

                 

         

                 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: openresty lua 可以通过 ngx.req.get_body_data() 函数来获取请求报文数据。如果请求报文是以 application/x-www-form-urlencoded 或 multipart/form-data 格式提交的,也可以通过 ngx.req.get_post_args() 函数来获取请求参数。如果请求报文是以 application/json 格式提交的,可以通过 ngx.req.get_body_data() 函数获取请求体数据,然后使用 json.decode() 函数将其解析为 Lua table。 ### 回答2: 要在OpenResty中接受请求报文数据,可以使用ngx.req模块。这个模块提供了处理请求内容的功能。 首先,我们可以使用ngx.req.get_method函数获取请求的方法,例如GET或POST。接下来,可以使用ngx.req.get_headers函数获取请求头的信息,例如User-Agent、Content-Type等。 要获取请求体的内容,可以使用ngx.req.read_body函数来读取请求体。然后,可以使用ngx.req.get_post_args函数来获取请求体的参数。如果请求体的类型是application/x-www-form-urlencoded,那么可以使用ngx.req.get_post_args函数直接获取参数。如果请求体是JSON格式,可以使用ngx.req.get_body_data函数获取请求体的原始数据,然后使用Lua中的json库进行解析。 另外,还可以使用ngx.req.get_uri_args函数来获取URL中的参数。这个函数返回一个Lua表,其中包含了URL中的所有参数。 除了获取请求报文数据,OpenResty还提供了ngx.req.set_header函数来设置请求头的信息。可以使用ngx.req.set_header函数来添加、修改或删除请求头的参数。 在处理完请求报文数据后,可以使用ngx.say函数来像客户端返回响应内容。可以将任何数据作为ngx.say函数的参数进行返回,包括字符串、数值、表等。 总结起来,通过ngx.req模块的函数,我们可以获取请求的方法、请求头、请求体、URL参数等请求报文数据,并且还可以设置请求头和返回响应内容。 ### 回答3: 在OpenResty中,可以通过使用ngx.req.get_body_data()方法接收请求报文数据。 ngx.req.get_body_data()方法用于获取请求报文主体的数据,并且可以在ngx_lua中方便地进行处理。 使用方法如下: local body_data = ngx.req.get_body_data() if body_data then -- 处理请求报文数据 -- ... else -- 请求报文没有主体数据 -- ... end 需要注意的是,ngx.req.get_body_data()方法只能获取请求报文中的主体数据,并不能获取请求报文的其他信息。如果需要获取其他请求信息,可以使用ngx.req.get_uri_args()获取查询参数,ngx.req.get_headers()获取请求头部信息,以及ngx.req.get_method()获取请求方法等。 在使用ngx.req.get_body_data()方法前,需要保证在nginx配置文件中已启用了请求体内容的接收。可以在http或server配置块中添加以下指令: http { # ... client_body_buffer_size 8k; client_max_body_size 8m; # ... } 以上是OpenResty Lua如何接收请求报文数据的方法。通过使用ngx.req.get_body_data()方法,我们可以方便地获取到请求报文的主体数据,并进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值