lua脚本获取request body

Posted 编程阁楼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua脚本获取request body相关的知识,希望对你有一定的参考价值。

     有些时候我们需要在nginx反向代理层对请求报文做些处理,第一想到的就是lua这个脚本语言。
    lua获取get请求的args比较简单,通过以下方式即可获取到:
  
    
    
  
args = ngx.req.get_uri_args()
但是对于post请求,获取request body就没那么简单了,因为如果请求体的size大于nginx配置里的client_body_buffer_size,则会导致请求体被缓冲到磁盘临时文件里,client_body_buffer_size默认是8k(32位系统)或者16k(64位系统)。
那么具体应该怎么获取呢?参见以下代码:
  
    
    
  
--body_data不一定是普通的字符串,这与请求的content-type有关,如multipart/form-data local body_data = ngx.req.get_body_data() if not body_data then local datafile = ngx.req.get_body_file() ngx.log(ngx.ERR, "body is in file: ", tostring(datafile))
if datafile then local fh, err = io.open(datafile, "r") if fh then fh:seek("set") body_data = fh:read("*a") fh:close() if body_data == "" then ngx.log(ngx.ERR, "request body is empty") end end end end
如果请求是普通post请求,以上方式获取request body已经足够了,但对于multipart/form-data类型请求,以上body_data中可能还包含了文件流信息,具体如何解析读者看先自行脑补。
multipart/form-data类型请求示例:
 --TNekoE5fCH9MSS3bDHD3cH42OnotPYFContent-Disposition: form-data; name="_data_"Content-Type: text/plain; charset=UTF-8Content-Transfer-Encoding: 8bit
{"fileName":"redis-use.png","bizCode":"1071"}--TNekoE5fCH9MSS3bDHD3cH42OnotPYFContent-Disposition: form-data; name="file"; filename="deaultFilename"Content-Type: application/octet-streamContent-Transfer-Encoding: binary...省略略内容
TNekoE5fCH9MSS3bDHD3cH42OnotPYF--
当然,我们也可以使用前人写好的插件实现透明化的解析,如lua_multipart,读者可自行学习。

以上是关于lua脚本获取request body的主要内容,如果未能解决你的问题,请参考以下文章

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段

nginx+lua怎样实现http请求的响应

lua脚本怎么获取当前正在执行的脚本的当前路径

asp.net 核心 1.0 mvc。从 Request.Body 获取原始内容

原创大叔问题定位分享(36)openresty(nginx+lua)中获取不到post数据,ngx.req.get_body_data返回nil

Lua异常处理