搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > 每天学点Android知识 > android WebView拦截请求详解

android WebView拦截请求详解

每天学点Android知识 2019-02-11
举报

1 WebView基本用法

WebView的基本用法相信大多数android开发者都是会使用的,最简单的就是调用个loadUrl方法,但是记得要在清单文件中添加网络权限。我也简单了写了一个加载百度的,如下图代码如是:

 
   
   
 
  1. mWebview = (WebView) findViewById(R.id.my_webview);

  2. mWebview.setWebViewClient(new WebViewClient() {

  3.        @Override

  4.        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

  5.                return false;

  6.            }

  7.        });

  8. mWebview.loadUrl("https://www.baidu.com/");

这是WebView最简单的使用了。

2 WebView拦截请求

WebView调用loadUrl后,会首先根据传入的URL获取响应,然后再将响应显示到页面上,这就是WebView的原理。那么我们可以在获取响应过程中重新改变请求URL或者直接将响应替换。而具体的替换在WebViewClient的WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)方法中,该方法用于根据请求去获取响应,如果返回null,那么android会根据请求去获取响应并返回,但是如果你重写了该方法并返回了响应,那么WebView就会使用你的响应数据。其中WebResourceRequet封装了请求,WebResourceResponse封装了响应。

2.1使用静态响应

既然知道了原理,那就试一下,先上代码和效果。

 
   
   
 
  1.  @Override

  2.  public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

  3.                String response = "<html>\n" +

  4.                        "<title>千度</title>\n" +

  5.                        "<body>\n" +

  6.                        "<a href=\"www.taobao.com\">千度</a>,比百度知道的多10倍\n" +

  7.                        "</body>\n" +

  8.                        "<html>";

  9.                WebResourceResponse webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(response.getBytes()));

  10.                return webResourceResponse;

  11.            }

  12. @Override

  13. public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

  14.                String response = "<html>\n" +

  15.                        "<title>千度</title>\n" +

  16.                        "<body>\n" +

  17.                        "<a href=\"www.taobao.com\">千度</a>,比百度知道的多10倍\n" +

  18.                        "</body>\n" +

  19.                        "<html>";

  20.                WebResourceResponse webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(response.getBytes()));

  21.                return webResourceResponse;

  22.            }

这段代码直接将响应换成了上面的一段html文字。效果如下:代码中重写了两个shouldInterceptRequest方法,其中一个WebResourceResponse shouldInterceptRequest (WebView view, String url)在API 21过时了。

2.2响应使用网络资源

shouldInterceptRequest方法API还有介绍,该方法是在非UI线程中,所以当需要与View系统交互时需要小心。既然是在非UI线程中,那么我们可以放在在其中做网络请求,比如获取www.importnew.com的响应数据,将百度替换为inportnew。

 
   
   
 
  1. @Override

  2.            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

  3.                StringBuilder stringBuilder = new StringBuilder();

  4.                BufferedReader bufferedReader = null;

  5.                try {

  6.                    URL url = new URL("http://www.inportnew.com/");

  7.                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

  8.                    httpURLConnection.setConnectTimeout(10 * 1000);

  9.                    httpURLConnection.setReadTimeout(40 * 1000);

  10.                    bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));

  11.                    String line = "";

  12.                    while ((line = bufferedReader.readLine()) != null)

  13.                        stringBuilder.append(line);

  14.                } catch (Exception e) {

  15.                    e.printStackTrace();

  16.                } finally {

  17.                    if (bufferedReader != null)

  18.                        try {

  19.                            bufferedReader.close();

  20.                        } catch (IOException e) {

  21.                            e.printStackTrace();

  22.                        }

  23.                }

  24.                WebResourceResponse webResourceResponse = null;

  25.                webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(stringBuilder.toString().getBytes()));

  26.                return webResourceResponse;

  27.            }

  28.            @Override

  29.            public WebResourceResponse shouldInterceptRequest(WebView view, String urlStr) {

  30.                StringBuilder stringBuilder = new StringBuilder();

  31.                BufferedReader bufferedReader = null;

  32.                try {

  33.                    URL url = new URL("http://www.importnew.com/");

  34.                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

  35.                    httpURLConnection.setConnectTimeout(10 * 1000);

  36.                    httpURLConnection.setReadTimeout(40 * 1000);

  37.                    bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));

  38.                    String line = "";

  39.                    while ((line = bufferedReader.readLine()) != null)

  40.                        stringBuilder.append(line);

  41.                } catch (Exception e) {

  42.                    e.printStackTrace();

  43.                } finally {

  44.                    if (bufferedReader != null)

  45.                        try {

  46.                            bufferedReader.close();

  47.                        } catch (IOException e) {

  48.                            e.printStackTrace();

  49.                        }

  50.                }

  51.                WebResourceResponse webResourceResponse = null;

  52.                webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(stringBuilder.toString().getBytes()));

  53.                return webResourceResponse;

  54.            }

2.3注意

WebView中调用的每个请求都会经过那个拦截器,所以如果一个页面中又有超链接,那么依然会经过那个拦截器,所以上面Importnew中有些图片没有加载出来。因为我是以本文形式获取响应的。并且是以utf-8作为编码的,所以有时会出现乱码。

3应用

之所以会设计到这块,是因为我做一款解析网上文章的app,因为需要对网页内容中删除某些内容以使在手机上显示好看,所以需要拦截请求,将响应中的部分内容删除之后再交由WebView去显示。所以特地研究了WebView拦截请求,不过最好是先判断要加载的URL是否是需要拦截的,如果不是的话,可以依然交给WebView去实现。


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《android WebView拦截请求详解》的版权归原作者「每天学点Android知识」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注每天学点Android知识微信公众号

每天学点Android知识微信公众号:android_every_day

每天学点Android知识

手机扫描上方二维码即可关注每天学点Android知识微信公众号

每天学点Android知识最新文章

精品公众号随机推荐

举报