openresty 学习笔记二:获取请求数据
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 学习笔记二:获取请求数据的更多相关文章
- yii学习笔记(4),获取请求数据的request组件
yii在控制器中获取请求数据需要通过request组件来完成 <?php namespace app\controllers; use yii; use yii\web\Controller; ...
- python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- JDBC学习笔记二
JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...
- openresty 学习笔记四:连接mysql和进行相关操作
openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...
- openresty 学习笔记三:连接redis和进行相关操作
openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
- Django学习笔记二
Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...
随机推荐
- 看从小自带BUFF的他,如何用代码降低万物互联的门槛
摘要:3岁下象棋,5岁解方程!他说物联网开发就像打怪玩游戏 本文分享自华为云社区<HDC.Cloud2021 | 华为云IoT开发者:用代码降低万物互联的门槛>,原文作者:华为云头条 . ...
- .NET RulesEngine(规则引擎)
一次偶然的机会,让我拿出RulesEngine去完成一个业务,对于业务来说主要是完成一个可伸缩性(不确定的类型,以及不确定的条件,条件的变动可能是持续增加修改的)的业务判断.比如说完成一个成就系统,管 ...
- 360加固保so动态脱壳
环境及工具 手机 : 中兴 U887 系统版本: Android 2.3.5 工具 : IDA pro 6.6 .0101Editor 目前so加壳有很多家,我己知的有 爱加密,梆 ...
- Bettercap2.X版本的使用
目录 Bettercap 安装 ARP欺骗 DNS 欺骗 注入脚本 结合Beef-XSS 替换下载文件 Bettercap 很多人应该都听过或者用过Ettercap,这是Kali下一款优秀的ARP欺骗 ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算 ...
- Windows子系统Ubuntu安装宝塔面板
首先你需要安装Ubuntu子系统,安装方法点击这里,安装完成后再进行下面的步骤. 安装宝塔面板 输入命令 wget -O install.sh http://download.bt.cn/instal ...
- Yii2表头强制不换行
在Yii2中使用GridView生成的表格有一个小问题,那就是表头的列宽是根据列的值自适应的,但有时值的长度比较小,表头就会出现下面这种情况(表头不在同一行,非常的不利于数据的查看) 设置强制不换行可 ...
- php 获取某文件夹(比如共享文件夹)下图片并下载并压缩成zip
1.前端部分:直接请求 2.后端php //zip下载public function downZip(){ $pro_code = "test"; //zip名称 //获取列表 $ ...
- java面试一日一题:如何判断一个对象是否为垃圾对象
问题:请讲下在java中如何判断一个对象是否为垃圾 分析:该问题主要考察对java中的垃圾回收,用什么方式去识别一个对象是垃圾: 回答要点: 主要从以下几点去考虑, 1.GC回收的是什么,回收发生在内 ...
- OPC使用思路