• openresty ngx_lua请求响应



    openresty ngx_lua请求响应

             

             

                                     

    请求头操作

              

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

    1. 语法格式:ngx.req.set_header(name, value)
    2. * name 如果不存在,表示添加
    3. * name 如果存在,表示修改
    4. 使用环境:set_by_lua*、rewrite_by_lua*
    5. access_by_lua*、content_by_lua*
    6. header_filter_by_lua*、body_filter_by_lua*
    7. # 示例
    8. ngx.req.set_header(name, "gtlx"):设置单个值
    9. ngx.req.set_header(test, {"1","2"}):使用数组设置多个值

                

    ngx.req.clear_header:删除请求头

    1. 语法格式:ngx.req.clear_header(name)
    2. 使用环境:set_by_lua*、rewrite_by_lua*
    3. access_by_lua*、content_by_lua*
    4. header_filter_by_lua*、body_filter_by_lua*
    5. # 示例
    6. ngx.req.clear_header(name):直接删除请求头
    7. ngx.req.set_header(test, nil):通过设置为nil,删除请求头

                 

    ngx.req.get_headers:获取请求头

    1. 语法格式:ngx.req.get_headers(max_headers?, raw?)
    2. 使用环境:set_by_lua*、rewrite_by_lua*
    3. access_by_lua*、content_by_lua*
    4. header_filter_by_lua*、body_filter_by_lua*
    5. # 示例
    6. location / {
    7. content_by_lua_block {
    8. local ngx = require "ngx";
    9. local headers = ngx.req.get_headers();
    10. for key,value in pairs(headers) do
    11. print(key .. value)
    12. end
    13. ngx.say(h["name"]) #获取名为name的请求头
    14. #等同于:ngx.var.http_name
    15. }
    16. }

               

                  

                                     

    请求体操作

             

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

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

              

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

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

                

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

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

                

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

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

                

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

    1. 语法:args, err = ngx.req.get_post_args(max_args?)
    2. * 从内存中读取请求体,返回table数据
    3. * max_args表示最多读取的参数个数
    4. 环境:rewrite_by_lua*、access_by_lua*、
    5. content_by_lua*、log_by_lua*、
    6. header_filter_by_lua*、body_filter_by_lua*

                    

                         

                                     

    响应头操作

             

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

    1. 语法:ngx.header.headerName = value、ngx.header["headerName"] = value
    2. * headerName存在,表示修改响应头
    3. * headerName不存在,表示添加响应头
    4. * value设置为nil,表示删除响应头
    5. * ngx.header.test_value = value:输出时,会自动转换为test-value = value
    6. 环境:rewrite_by_lua*、access_by_lua*、
    7. content_by_lua*、log_by_lua*、
    8. header_filter_by_lua*、body_filter_by_lua*

                

    ngx.resp.get_headers:获取响应头

    1. 语法:headers = ngx.resp.get_headers(max_headers?, raw?)
    2. * 读取响应头,以table类型返回
    3. 环境:rewrite_by_lua*、access_by_lua*、
    4. content_by_lua*、log_by_lua*、balancer_by_lua*、
    5. header_filter_by_lua*、body_filter_by_lua*

             

                  

                                     

    响应体操作

             

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

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

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

              

                  

                                     

    使用示例

             

    default.conf

    1. server {
    2. listen 80;
    3. server_name localhost;
    4. location /test {
    5. content_by_lua_block {
    6. ngx.say("hello");
    7. ngx.sleep(3);
    8. ngx.say("gtlx");
    9. }
    10. }
    11. location /test2 {
    12. content_by_lua_block {
    13. ngx.say("hello");
    14. ngx.flush();
    15. ngx.sleep(3);
    16. ngx.say("gtlx 2");
    17. }
    18. }
    19. location /test3 {
    20. content_by_lua_block {
    21. ngx.say("hello");
    22. ngx.flush(true);
    23. ngx.sleep(3);
    24. ngx.say("gtlx 3");
    25. }
    26. }
    27. #error_page 404 /404.html;
    28. error_page 500 502 503 504 /50x.html;
    29. location = /50x.html {
    30. root /usr/local/openresty/nginx/html;
    31. }
    32. }

              

    创建容器

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

           

    使用测试

    1. # 全部内容等待3s后输出
    2. huli@hudeMacBook-Pro conf7 % curl localhost:3000/test
    3. hello
    4. gtlx
    5. # hello先输出,gtlx 2等待3s后输出
    6. huli@hudeMacBook-Pro conf7 % curl localhost:3000/test2
    7. hello
    8. gtlx 2
    9. # hello先输出,gtlx 2等待3s后输出
    10. huli@hudeMacBook-Pro conf7 % curl localhost:3000/test3
    11. hello
    12. gtlx 3

            

                   

                                     

    使用示例 2

             

  • 相关阅读:
    使用docker安装db2
    【WSN】基于LGNDO算法实现传感器物理路由优化附matlab代码
    Linux 网络配置 01
    学生请假管理系统
    PC威信 3.7.5 测试HOOK接口
    Django使用mysqlclient服务连接并写入数据库
    Android项目集成flutter模块
    【Java I/O 流】文件的操作——java.io.File 类详解
    自定义结构体的json序列化
    深入浅出索引
  • 原文地址:https://blog.csdn.net/weixin_43931625/article/details/125616063