使用ngx.req.get_post_args时,请求头中成功发送,但是服务器收不到信息的问题
ngx.req.get_post_args
用法:args, err = ngx.req.get_post_args(max_args?)
可用模块:rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*
返回一个 Lua 表,其中包含所有当前请求 POST 查询参数(MIME 类型为application/x-www-form-urlencoded
)
(application/x-www-form-urlencoded
常用于HTML表单提交:由键值对组成的字符串,一般形式为:key1=value1&key2=value2&key3=value3
)。
调用 ngx.req.read_body()
先读取请求正文或打开 lua_need_request_body 指令以避免错误。(nginx默认不读)
默认参数最多解析100个请求参数,并且会以静默方式丢弃其他请求参数,以防止潜在的拒绝服务攻击。从 v0.10.13 开始,当超过限制时,它将返回第二个值,即字符串truncated
max_args
参数可以设置为零,以消除限制并处理收到的所有请求参数
问题
ngx.req.get_post_args()
的问题,MIME类型为application/x-www-form-urlencoded
,如果发送方以json格式或其他格式发送,那么无法正确接受信息,例如
接收到的信息为:
解决方案
使用ngx.req.get_body_data()
,同时使用cjson.decode()
解码收到的data信息。
收到的结果为:
ngx.req.get_body_data
用法:data = ngx.req.get_body_data(max_bytes?)
可用模块:rewrite_by_lua*, access_by_lua*, content_by_lua*, log_by_lua*
检索内存中的请求体数据。它返回的是一个 Lua 字符串,而不是一个包含所有解析后查询参数的 Lua 表。如果你需要一个 Lua 表,应该使用 ngx.req.get_post_args
函数。如果不需要整个请求体,可以使用可选的 max_bytes
参数。
这个函数在以下情况下返回 nil
:
- 请求体尚未被读取;
- 请求体已被读取到磁盘的临时文件中;
- 或者请求体的大小为零。
如果请求体还没有被读取,首先调用 ngx.req.read_body
(或者将 lua_need_request_body
打开以强制这个模块读取请求体。然而,这并不推荐)。如果请求体已经被读取并存入磁盘文件,尝试使用 ngx.req.get_body_file
函数代替。
要强制使用内存中的请求体,尝试将 client_body_buffer_size
设置为与 client_max_body_size
相同的大小值。
注意,使用这个函数而不是使用 ngx.var.request_body
或 ngx.var.echo_request_body
更高效,因为它可以节省一次动态内存分配和一次数据复制。