openresty 学习笔记二:获取请求数据

openresty 获取POST或者GET的请求参数。这个是要用openresty 做接口必须要做的事情。
这里分几种类型:GET,POST(urlencoded),POST(form-data)。可以根据需要选择某种提交请求的方式,也可以集合封装成一个工具库来使用

GET 请求

GET的请求数据比较简单

function _M.get(self)
local getArgs = {}
getArgs = ngx.req.get_uri_args()
return getArgs
end

  

POST(urlencoded) 请求

urlencoded类型的POST请求数据也比较简单

function _M.post_urlencoded(self)
local postArgs = {}
postArgs = ngx.req.get_post_args()
return postArgs
end

  

POST(form-data) 请求

form-data类型的POST请求数据就比较复杂,需要进行字符串分割(lua好像不带split方法),所以首先要写一个split方法

function _M.split(self,s, delim)

    if type(delim) ~= "string" or string.len(delim) <= 0 then
return nil
end local start = 1
local t = {} while true do
local pos = string.find (s, delim, start, true) -- plain find if not pos then
break
end table.insert (t, string.sub (s, start, pos - 1))
start = pos + string.len (delim)
end table.insert (t, string.sub (s, start)) return t
end

  

获取form-data的请求参数需要用到upload库来获取表单,这个库安装openresty默认已经带了,也可以上GITHUB下载最新版本

local upload = require "resty.upload"
local form, err = upload:new(4096) function _M.post_form_data(self,form,err) if not form then
ngx.log(ngx.ERR, "failed to new upload: ", err)
return {}
end form:set_timeout(1000) -- 1 sec
local paramTable = {["s"]=1}
local tempkey = ""
while true do
local typ, res, err = form:read()
if not typ then
ngx.log(ngx.ERR, "failed to read: ", err)
return {}
end
local key = ""
local value = ""
if typ == "header" then
local key_res = _M:split(res[2],";")
key_res = key_res[2]
key_res = _M:split(key_res,"=")
key = (string.gsub(key_res[2],"\"",""))
paramTable[key] = ""
tempkey = key
end
if typ == "body" then
value = res
if paramTable.s ~= nil then paramTable.s = nil end
paramTable[tempkey] = value
end
if typ == "eof" then
break
end
end
return paramTable
end args = _M:post_form_data(form, err)

  

根据请求类型不同使用不同方法进行获取

根据需要,也可以将其合并起来

  • function _M.new()
    local args = {}
    local requestMethod = ngx.var.request_method
    local receiveHeaders = ngx.req.get_headers()
    local upload = require "resty.upload"
    local form, err = upload:new(chunk_size) if "GET" == requestMethod then
    args = _M:get()
    elseif "POST" == requestMethod then
    ngx.req.read_body()
    if string.sub(receiveHeaders["content-type"],1,20) == "multipart/form-data;" then
    args = _M:post_form_data(form, err)
    else
    args = _M:post_urlencoded()
    end
    end return args
    end return _M

      

openresty 学习笔记二:获取请求数据的更多相关文章

  1. yii学习笔记(4),获取请求数据的request组件

    yii在控制器中获取请求数据需要通过request组件来完成 <?php namespace app\controllers; use yii; use yii\web\Controller; ...

  2. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  3. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  4. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  5. openresty 学习笔记四:连接mysql和进行相关操作

    openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...

  6. openresty 学习笔记三:连接redis和进行相关操作

    openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...

  7. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  8. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  9. Django学习笔记二

    Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...

随机推荐

  1. 分布式锁的实现之 redis 篇

    为什么需要分布式锁 引入经典的秒杀情景,100件商品供客户抢.如果是单机版的话,我们使用synchronized 或者 lock 都可以实现线程安全.但是如果多个服务器的话,synchronized ...

  2. 1049 Counting Ones

    The task is simple: given any positive integer N, you are supposed to count the total number of 1's ...

  3. 10.for循环

    for循环 语法: for(初始化; 布尔表达式; 更新) { //代码语句 } 初始化最先执行,可以声明一种类型,可初始化一个或多个循环控制变量,也可以是一个空语句. 布尔值判断,为 true 执行 ...

  4. Xposed框架中XSharePreference的使用

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/81194406 在Xposed框架的模块编写中,通常希望我们自己写的Android ...

  5. SSH后门万能密码

    当我们在获得一台Linux服务器的 root 权限后,我们第一想做的就是如何维持这个权限,维持权限肯定想到的就是在目标服务器留下一个后门.但是留普通后门,肯定很容易被发现.我们今天要讲的就是留一个SS ...

  6. 复现Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)

    靶机IP(Ubuntu):192.168.43.185 攻击IP(kali):192.168.43.37 一.docker环境搭建 打开vulhub靶机,目录定位到vulhub-master/shir ...

  7. Day009 面向对象和方法回顾

    面向过程&面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么..... 面象过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些 ...

  8. 【ECharts】报表联动,动态数据设计

    说明: 数据没有拉取后台数据,仅仅前端模拟数据,Copy即可有效果.联动后台时,使用异步获取数据即可.鼠标点击,动态展示点击项的数据.有关更多实例,请移步到echarts官网查看. 成果展示: 相关代 ...

  9. Mac安装python 环境& pychaem

    一.文档说明 在Mac上其实自带python环境,但是很多的library安装python是2.7的版本. 验证:可以在终端Terminal中输入:python 如下图是未安装之前,但是咱们需要在自己 ...

  10. mysql.data.entityframeworkcore 已弃用

    转官网有方案: https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core.html General R ...