——这次分享一下模拟带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值;