原文链接: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字符串
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于