Lua中使用cjson解析ngx.location.capture返回的gzip
今天在Lua中通过cjson解析http的response的时候遇到了个小坑,关于ngx.location.capture返回结果处理的一些注意
一、问题描述
场景是在Lua中通过ngx.location.capture发出一个请求,返回结果是一个json,想要通过cjson类库decode一下,然后获取内容:
local res = ngx.location.capture(url) local cjson = require("cjson.safe") local resu = cjson.decode(res.body)
处理逻辑大致是这样的,但是通过日志发现在通过resu解析的时候报错了:

可是通过浏览器直接请求,看到的结果明明就是json格式的啊,为什么这里会解析失败呢?
二、问题缘由
后来通过postman抓取了一下请求,看到返回结果的Content-Encoding是gzip的,就是说接口的服务端在发送请求时是进行了压缩的
而我们在浏览器中能看到正确的内容,是因为浏览器帮我们做了解压缩的处理,但是Lua不能

所以最后我们设置了一下请求header,问题就解决了
有两种方式可以进行设置,这个根据自己的代码结构进行选择:
ngx.req.set_header("Accept-Encoding","")
或者是在nginx.conf的反向代理里面设置:
proxy_set_header Accept-Encoding "";

浙公网安备 33010602011771号