163音乐点歌乱码分析以及解决办法
简书链接:163音乐点歌乱码分析以及解决办法
文章字数:414,阅读全文大约需要1分钟
习惯抓包然后把所有请求头弄上去,结果电脑上正常,手机模拟访问竟然是乱码的,我就郁闷了,竟然是http的常识坑死了我,还以为是163有什么高级手段呢。
解决方法是删除Accept-Encoding
的模拟,或者自己手动解码.
1 | map.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36.35068264 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"); |
大致猜测可能是Accept,或者Accept-Encoding的问题后面搜索了一下,所以new一个GZIPInputStream
就可以解决
1 |
|
结果又出现新的错误了
1 | ``` |
实际上上面的代码也不能解决问题,上面我也copy错代码了,是压缩的代码,而并非是解压的代码,另外压缩的流如果强制转换为字符串然后再转回去会出现问题,所以我的简单的网络请求框架需要改写 判断请求头是否包含zip如果包含就进行自动解码操作.
原生的解压已经是字符串了,,
1 |
|
public class GzipRequestInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
if (originalRequest.body() == null || originalRequest.header(“Content-Encoding”) != null) {
return chain.proceed(originalRequest);
}
Request compressedRequest = originalRequest.newBuilder()
.header("Content-Encoding", "gzip")
.method(originalRequest.method(), gzip(originalRequest.body()))
.build();
return chain.proceed(compressedRequest);
}
private RequestBody gzip(final RequestBody body) {
return new RequestBody() {
@Override
public MediaType contentType() {
return body.contentType();
}
@Override
public long contentLength() {
return -1; // 无法提前知道压缩后的数据大小
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
body.writeTo(gzipSink);
gzipSink.close();
}
};
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 情迁博客!
评论