Retrofit添加gzip请求头后GsonConverterFactory解析异常问题排查
问题原因与解决方法
核心问题
OkHttp确实会自动处理gzip/deflate格式的响应解压,但手动添加Accept-Encoding请求头可能干扰了OkHttp的默认解压逻辑,导致Gson拿到未解压的二进制压缩数据,进而抛出解析错误。
解决步骤
- 移除手动添加的
Accept-Encoding拦截器:OkHttp默认会自动添加合适的Accept-Encoding请求头(如gzip),并在收到带Content-Encoding头的压缩响应时自动完成解压,无需手动干预。 - 检查OkHttp自动解压状态:确认创建
OkHttpClient时没有调用disableAutomaticDecompression()方法,该方法会关闭默认的自动解压功能。 - 验证服务器响应:通过抓包工具(如Charles)检查服务器返回的响应头是否包含
Content-Encoding: gzip或deflate,同时确认响应体是否为正常JSON数据(而非二进制压缩内容)。如果服务器返回压缩数据但未携带Content-Encoding头,OkHttp不会自动解压,需联系服务端修复响应头。
修正后的代码示例
// 使用默认OkHttpClient配置,无需手动添加编码头 val client = OkHttpClient.Builder().build() val gson = GsonBuilder().setLenient().create() val retrofit = Retrofit.Builder() .client(client) .baseUrl("http://your-base-url.com/") .addConverterFactory(GsonConverterFactory.create(gson)) .build()
内容的提问来源于stack exchange,提问作者Xixiaxixi
相关产品推荐
相关产品推荐

