Android OKhttp添加头部Accept-Encoding为gzip,deflate的坑

    Android OKhttp 网络请求添加了addHeader("Accept-Encoding", "gzip, deflate")造成json解析异常,debug之后,报com.alibaba.fastjson.JSONException: syntax error, pos 2, json : ....查找了半天找不到原因。

    我们开发测试环境下都是正常可以的,结果正式环境下,运维加了 gzip 压缩,说是为了要省流量带宽,结果就悲剧了,Android HTTP 请求都走异常的方法,iOS没有问题,很崩溃。

其实这些都是 gzip 压缩的数据,不是说 OkHttp 是自动支持 gzip 解压缩的吗?为什么我们的返回数据没有进行 gzip 解压?还有一个奇怪的现象是,当我把这段代码 addHeader("Accept-Encoding", "gzip") 注释掉之后,一切又恢复正常了。原因是BridgeInterceptor 的拦截器里已经做了压缩处理,具体源码分析 可以看简书这篇文章http://events.jianshu.io/p/a9d861732445


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"br" 是一种较新的 HTTP 压缩算法,也称为 Brotli 压缩算法。在 Java 中,可以使用第三方库 okhttp 来解析 "br" 编码的响应体。 以下是一个示例代码: ```java import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; import okhttp3.Headers; import okhttp3.MediaType; import okhttp3.internal.http.HttpHeaders; import okhttp3.internal.http.RealResponseBody; import okhttp3.internal.http1.Http1Codec; import java.io.IOException; import java.util.ArrayList; public class BrotliResponseDecoder { public static void main(String[] args) throws IOException { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://example.com") .addHeader("Accept-Encoding", "br") .build(); Response response = client.newCall(request).execute(); ResponseBody responseBody = response.body(); Headers headers = response.headers(); MediaType contentType = responseBody.contentType(); if (HttpHeaders.hasBody(response)) { ArrayList<ResponseBody> intermediates = new ArrayList<>(); ResponseBody intermediateBody = new RealResponseBody(contentType.toString(), -1L, intermediates); Http1Codec http1Codec = new Http1Codec(null, null, null, null, -1L, false); intermediates.add(responseBody); responseBody = http1Codec.openResponseBody(intermediateBody); } String decodedResponse = responseBody.string(); System.out.println(decodedResponse); } } ``` 在这个示例代码中,我们通过 OkHttpClient 发送了一个带有 "Accept-Encoding: br" 请求头部的 GET 请求。然后,我们可以通过调用 Response 对象的 body() 方法获取响应体 ResponseBody 对象,并通过 headers() 方法获取响应头 Headers 对象。接着,我们判断响应体是否存在,如果存在则调用 openResponseBody() 方法对响应体进行解压缩,最后通过 string() 方法获取解压后的响应体字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值