原文链接:OpenResty 实战之 gzip 解压与 json 解析
客户端访问 OpenResty ,如果配置文件 nginx.conf 里配置了 gzip 相关选项,OpenResty 会自动根据客户端请求返回对应的格式。
如果 OpenResty 访问后端服务,并且带有 gzip header 例如 gzip-deflate 或 deflate-raw,并且需要在 OpenResty 一端解析修改某些值时,需要先解压,然后再修改。
解压代码如下:
local ffizlib = require('ffi-zlib')
local output_table = {}
local count = 0
local output = function(data)
table_insert(output_table, data)
end
local input = function(bufsize)
local start = count > 0 and bufsize*count or 1
local data = body:sub(start, (bufsize*(count+1)-1) )
count = count + 1
return data
end
local chunk =16384
local ok, err = ffizlib.inflateGzip(input, output, chunk)
if not ok then
-- Err message
ngx_log(ngx_INFO,"err:", err)
end
local output_data = table_concat(output_table,'')
--ngx_log(ngx_INFO,"output_data: ", output_data)
上面代码最后 output_data 就是解压后的数据,是字符串类型,可以进行相关的替换和解析等操作。
例子 1: 使用 gsub 进行全居替换
local body, n, err = ngx.re.gsub(output_data, "www.11.com", "m.11.com")
例子 2: json 解析
local cjson = require("cjson")
local retTable = {}; --最终产生json的表
local requestresultdata = cjson.decode(output_data); --解析json字符串
retTable["Count"]="7"
retTable["Key"]=requestresultdata["Key"]
local jsonStr = cjson.encode(retTable) --将表数据编码成json字符串
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于