Android HttpURLConnection设定Accept-Encoding为gzip的时候返回数据出现乱码

设定的位置是这个方法,拦截请求,然后在WebView的请求头中加自己的Header 

 mWebView.setWebViewClient(new WebViewClient() {

            @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
}
});

下面是设置请求头的代码如下 

URL url = new URL(request.getUrl().toString());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Accept-Encoding","gzip,deflate");
connection.getOutputStream().write(mPostBytes);
return new WebResourceResponse("text/html",connection.getHeaderField("encoding"), connection.getInputStream());

本身HttpURLConnection是默认支持自动Gzip压缩与配套解压缩处理的,但是如果手动设置了下面这句话,自动的处理就不灵了,也就是说,请求头手动加了这个,那么返回的数据也要手动解压缩。要么就不要手动加这个。

connection.setRequestProperty(Constants.REQUEST_PROPERTY_ACCEPT_ENCODING,"gzip,deflate");

手动加解压缩的方法也很简单,如下图:

//改之前:
return new WebResourceResponse("text/html",connection.getHeaderField("encoding"), connection.getInputStream());
//改之后:
return new WebResourceResponse("text/html",connection.getHeaderField("encoding"), new GZIPInputStream(connection.getInputStream()));

利用的是【GZIPInputStream】这个类。

另外,如果服务器本身根本不支持Gzip的情况下,即使你怎么手动配置gzip请求头都无所谓,因为服务器根本不支持,怎么样都是返回的未压缩的纯文本,是不会出现问题的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章