lua读取请求体

前言

nginx默认不读取请求体的数据,但可以通过$request_body内置变量来获取。$request_body存在内存中,如果它的字节大小超过nginx配置的client_body_buffer_size的值,nginx就会把请求体存放到临时文件中。此时数据就不在内存中了,这会导致$request_body为空。

同步非阻塞方式获取请求体

ngx.req.read_body

含义:同步读取客户端请求体,且不会阻塞nginx的事件循环。使用此指令后,就可以通过ngx.req.get_body_data来获取请求体的数据了。但如果使用临时文件来存放请求体,就需要先使用函数ngx.req.get_body_file来获取临时文件名,再读取临时文件中的请求体数据。

环境:rewrite_by_lua*access_by_lua*content_by_lua*

ngx.req.get_body_data

含义:执行ngx.req.read_body指令后,可以使用本指令在内存中获取请求体数据,结果会返回一个lua的字符串类型的数据。如果要获取table类型的数据,则需要使用ngx.req.get_post_args

环境:rewrite_by_lua*access_by_lua*content_by_lua*log_by_lua*

ngx.req.get_post_args

含义:读取包含当前请求在内的所有post请求的查询参数,返回一个table类型的数据

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

ngx.req.get_body_file

含义:获取存放请求体的临时文件名。如果请求体被存放在内存中,获取的值就是nil。

示例

获取string类型的请求体

复制代码
location /testlua {
    client_max_body_size 10k;
    client_body_buffer_size 1k;
    content_by_lua_block {
        local ngx = require "ngx";
        ngx.req.read_body()  -- 开启读取请求体模式
        local data = ngx.req.get_body_data()  -- 获取内存中的请求体
        if data then
            ngx.print(string.format("data: %s, type: %s",data,type(data)))
            return
        else
            local file = ngx.req.get_body_file() -- 如果内存中没有, 则到临时文件中读取
            if file then
                ngx.say("body is in file ", file)
            else
                ngx.say("no body found")
            end
        end
    }
}
相关推荐
Lisonseekpan几秒前
为什么Spring 推荐使用构造器注入而非@Autowired字段注入?
java·后端·spring·log4j
BingoGo1 分钟前
PHP 之高级面向对象编程 深入理解设计模式、原则与性能优化
后端·php
橙 子_2 分钟前
在 Amazon Bedrock 中推出 Claude Sonnet 4.5:Anthropic 最智能的模型,最适合编码和复杂代理
人工智能·python·云原生·html
草莓熊Lotso2 分钟前
Python 流程控制完全指南:条件语句 + 循环语句 + 实战案例(零基础入门)
android·开发语言·人工智能·经验分享·笔记·后端·python
laozhoy12 分钟前
深入理解Golang中的锁机制
开发语言·后端·golang
码luffyliu5 分钟前
Go 中的深浅拷贝:从城市缓存场景讲透指针与内存操作
后端·go·指针·浅拷贝·深拷贝
老华带你飞6 分钟前
个人网盘管理|基于springboot + vue个人网盘管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
智算菩萨6 分钟前
自然语言处理常用Python库:spaCy使用全解
人工智能·python·自然语言处理
deephub11 分钟前
ONNX Runtime Python 推理性能优化:8 个低延迟工程实践
开发语言·人工智能·python·神经网络·性能优化·onnx
JaguarJack18 分钟前
PHP 之高级面向对象编程 深入理解设计模式、原则与性能优化
后端·php