Nginx+Lua(OpenResty)搭建以及成果测试(3)!

本文介绍如何使用Lua脚本解析带Body的POST请求,并详细解释了curl模拟POST请求的方法,以及如何利用cjson库将JSON格式的Body内容转换为Table类型进行遍历和访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——这次分享一下模拟带Body的POST请求,然后利用Lua脚本解析参数数据。

1、curl 模拟POST命令

curl http://localhost/luatest -H "Content-Type:application/json"  -d '{"user":"me","id":"5"}'
# -H "Content-Type:application/json" 大概意思就是以json格式传输
# -d '{"user":"me","id":"5"}'        要传输的字段/参数

2、编写Lua脚本

local cjson = require "cjson"                   #后面要用到cjson库
if "POST" == request_method then
          ngx.say("This is POST Have Body")

          ngx.req.read_body()                   #开启获取body体中的内容
          local test = ngx.req.get_body_data()  #定义test 接收body内容
          ngx.say("test type: ",type(test))                   #判断test类型
          ngx.say("test is: ",test)                         #打印输出test
  
          ngx.say("after parsing json:")        #使用json解析之后的数据
          local requst = cjson.decode(test)     #定义requst 接收解析后的数据,decode函数作用就是解析。
          ngx.say("requst type: ",type(requst))                 #判断解析后requst的类型
          
          for key,val in pairs(requst) do       #循环遍历requst,打印requst内容
              ngx.say("key:",key,",val:",val)
              end
          
          ngx.say(requst["user"])               #单独打印key对应的val值
          ngx.say(requst["id"])                 #单独打印key对应的val值
end
ngx.say("Test End")

3、分析日志

#打印的日志,每一句打印都与Lua脚本中的语句对应
This is POST Have Body
test type :string                #test 类型为string
test is: {"user":"me","id":"5"}
#--------------------------------分界线
after parsing json:
requst type :table                #requst类型为table

key:id, val:5                     #for循环遍历出的值
key:user, val:me
me                              #通过requst["user"] 方式访问
5                               #通过requst["id"] 方式访问
Test End                        

4、总结

——通过lua脚本打印出的日志可以看到,当发送带Boay的POST请求以后,nginx通过ngx.req.get_body_data()函数接收body体里面的内容,但是通过打印test发现,接收到的test为String类型,也就是日志中的{"user":"me","id":"5"},但由于String不便于解析,所以之后通过cjson.decode()函数将test转换为requst,打印发现requst为Table类型,所以使用for循环来遍历输出table里面的内容,同时也可以使用requst["key"]这种方式,来访问table里面对应的val值;

——END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值