WebView 不呈现 HTML/gzip 内容,该内容通过 shouldInterceptRequest() webViewClient 方法中的 HttpURLConnection 接收

Posted

技术标签:

【中文标题】WebView 不呈现 HTML/gzip 内容,该内容通过 shouldInterceptRequest() webViewClient 方法中的 HttpURLConnection 接收【英文标题】:WebView does not render HTML/gzip content, which is received via HttpURLConnection in shouldInterceptRequest() webViewClient method 【发布时间】:2017-09-06 15:38:41 【问题描述】:

Android 21+

我们有一个覆盖 shouldInterceptRequest 方法的 WebViewClient。在此方法中,我们手动发出 HTTP GET 请求,并将接收到的 InputStream 作为 WebResourceResponse 传递,完全期望 WebView 显示接收到的数据。接收到的内容是压缩后的 html

@Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) 
            HttpURLConnection urlc = null;
            try 
                URL url = new URL(request.getUrl().toString());
                urlc = (HttpURLConnection) network.openConnection(url); // network instance is received via some other way, unrelated to this problem
                urlc.setRequestMethod("HEAD");
                urlc.connect();

                String contentType = urlc.getContentType();
                String contentEncoding = urlc.getContentEncoding();
                urlc.disconnect();

                urlc = (HttpURLConnection) network.openConnection(url);
                urlc.connect();

                return new WebResourceResponse(contentType, contentEncoding, urlc.getInputStream());
             catch (Exception e) 
               ...
            

但是,WebView 只显示文本 - 它不显示正确的 HTML,它只显示原始内容,这是页面上显示的示例:

<html>
<head>SomeTitle</head>
<body>content....</body>
</html>

看起来它要么不理解提供的数据是 HTML,要么无法解析它(可能是因为 gzip?)。还是发生了其他事情?

通过 HEAD 调用接收到的内容类型和内容编码是:

HEAD REQUEST | CONTENT TYPE: text/html;charset=UTF-8 | ENCODING: gzip

并传递给WebResourceResponse,如上面的代码所示。

有什么想法吗..?

【问题讨论】:

【参考方案1】:

似乎有必要从内容类型字符串中删除分号及其后面的所有内容。

int semicolon = contentType.indexOf(';');
if (semicolon >= 0) 
    contentType = contentType.substring(0, semicolon).trim();

【讨论】:

以上是关于WebView 不呈现 HTML/gzip 内容,该内容通过 shouldInterceptRequest() webViewClient 方法中的 HttpURLConnection 接收的主要内容,如果未能解决你的问题,请参考以下文章

即使由于在另一个选项卡中而不可见,如何使 JavaFX 的 webview 呈现?

HTML5 - 在 Android WebView 中首次加载时未呈现画布

在用户交互之前,Android WebView 无法完全呈现内容

保存在 webView 中呈现的可编辑文本

反应原生 - 构建发布 apk 时 webview 不呈现本地 html

Nativescript-Vue中如何根据内容长度设置WebView的高度?