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 "";

 

 

posted @ 2019-11-21 20:06  SyrupzZ  阅读(805)  评论(0)    收藏  举报