电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

在Android環(huán)境下WebView中攔截所有請求并替換URL示例詳解

瀏覽:54日期:2022-09-23 11:14:03

需求背景

接到這樣一個需求,需要在 WebView 的所有網(wǎng)絡請求中,在請求的url中,加上一個xxx=1的標志位。

例如 http://www.baidu.com 加上標志位就變成了 http://www.baidu.com?xxx=1

尋找解決方案

從 Android API 11 (3.0) 開始,WebView 開始在 WebViewClient 內(nèi)提供了這樣一條 API ,如下:

public WebResourceResponse shouldInterceptRequest(WebView view, String url)

就是說只要實現(xiàn) WebViewClient 的 shouldInterceptRequest 方法,然后調(diào)用 WebView 的setWebViewClient 就可以了。

但是,在 API21 以上又棄用了上述 API,使用了一條新的 API,如下:

public WebResourceResponse shouldInterceptRequest(WebView view, final WebResourceRequest request)

好吧,為了支持盡量多的版本,看來兩個都需要實現(xiàn)了,發(fā)現(xiàn)一看就非常好用的 String url 變成了一個WebResourceRequest request。WebResourceRequest 這個東西是一個接口,并且是這樣定義的:

public interface WebResourceRequest { Uri getUrl(); boolean isForMainFrame(); boolean hasGesture(); String getMethod(); Map<String, String> getRequestHeaders();}

在其中沒有發(fā)現(xiàn)任何可以直接替換請求的方法。

然后搜索了一下 Android 代碼中對他的引用,點我搜索。然后發(fā)現(xiàn) private static class WebResourceRequestImpl implements WebResourceRequest 它的內(nèi)部實現(xiàn)僅僅是一個單純的實體。那這個東西要替換就非常好辦了,三個方法都可以做:

動態(tài)代理 反射 重新實現(xiàn)

實現(xiàn)

方案確定了,剩下的就簡單了。直接上代碼。

首先是往URL字符串加那個標志位的方法

public static String injectIsParams(String url) { if (url != null && !url.contains('xxx=') { if (url.contains('?')) { return url + '&xxx=1'; } else { return url + '?xxx=1'; } } else { return url; }}

然后要攔截所有請求了

webView.setWebViewClient(new WebViewClient() { @SuppressLint('NewApi') @Override public WebResourceResponse shouldInterceptRequest(WebView view, final WebResourceRequest request) { if (request != null && request.getUrl() != null) { String scheme = request.getUrl().getScheme().trim(); if (scheme.equalsIgnoreCase('http') || scheme.equalsIgnoreCase('https')) { return super.shouldInterceptRequest(view, new WebResourceRequest() { @Override public Uri getUrl() { return Uri.parse(injectIsParams(request.getUrl().toString())); } @SuppressLint('NewApi') @Override public boolean isForMainFrame() { return request.isForMainFrame(); } @SuppressLint('NewApi') @Override public boolean hasGesture() { return request.hasGesture(); } @SuppressLint('NewApi') @Override public String getMethod() { return request.getMethod(); } @SuppressLint('NewApi') @Override public Map<String, String> getRequestHeaders() { return request.getRequestHeaders(); } }); } } return super.shouldInterceptRequest(view, request); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (!TextUtils.isEmpty(url) && Uri.parse(url).getScheme() != null) { String scheme = Uri.parse(url).getScheme().trim(); if (scheme.equalsIgnoreCase('http') || scheme.equalsIgnoreCase('https')) { return super.shouldInterceptRequest(view, injectIsParams(url)); } } return super.shouldInterceptRequest(view, url); } });

大功告成。

歡迎指出代碼中的問題~~一起學習進步

注意: 注意保護 URL 的 Scheme,在代碼中特地過濾了 http 和 https。

引申

上邊的 API 中發(fā)現(xiàn)還能有更多的玩法,比如:

替換 WebResourceResponse,構(gòu)造一個自己的 WebResourceResponse。比如下列代碼,用一個包里的本地文件替換掉要請求的網(wǎng)絡圖片。

WebResourceResponse response = null; if (url.contains('logo')) { try { InputStream is = getAssets().open('test.png'); response = new WebResourceResponse('image/png', 'UTF-8', is); } catch (IOException e) { e.printStackTrace(); } }return response;

在 API 21 (5.0) 以上的版本使用了 WebResourceRequest 接口,這個接口能修改發(fā)出請求的 Header

@Overridepublic Map<String, String> getRequestHeaders() { return request.getRequestHeaders();}

在 API 21 (5.0) 以上的版本中可以區(qū)分 GET 請求和 POST 請求,在某些情況下,需要區(qū)分 AJAX 的不同種類請求的時候可以用到。

到此這篇關于在Android環(huán)境下WebView中攔截所有請求并替換URL示例詳解的文章就介紹到這了,更多相關Android WebView攔截所有請求并替換URL內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Android
相關文章:
主站蜘蛛池模板: 北京普辉律师事务所官网_北京律师24小时免费咨询|法律咨询 | 钢结构厂房造价_钢结构厂房预算_轻钢结构厂房_山东三维钢结构公司 | 美名宝起名网-在线宝宝、公司、起名平台| 硫化罐_蒸汽硫化罐_大型硫化罐-山东鑫泰鑫智能装备有限公司 | 天津仓库出租网-天津电商仓库-天津云仓一件代发-【博程云仓】 | 网站建设-网站制作-网站设计-网站开发定制公司-网站SEO优化推广-咏熠软件 | 透平油真空滤油机-变压器油板框滤油机-滤油车-华之源过滤设备 | 江苏齐宝进出口贸易有限公司 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 制样机-密封锤式破碎机-粉碎机-智能马弗炉-南昌科鑫制样 | 希望影视-高清影视vip热播电影电视剧免费在线抢先看 | 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 齿式联轴器-弹性联轴器-联轴器厂家-江苏诺兴传动联轴器制造有限公司 | 磁力反应釜,高压釜,实验室反应釜,高温高压反应釜-威海自控反应釜有限公司 | 婚博会2024时间表_婚博会门票领取_婚博会地址-婚博会官网 | 医学模型生产厂家-显微手术模拟训练器-仿真手术模拟训练系统-北京医教科技 | 高光谱相机-近红外高光谱相机厂家-高光谱成像仪-SINESPEC 赛斯拜克 | 环比机械 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 全自动固相萃取仪_高通量真空平行浓缩仪-勤业永为 | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | 一体化净水器_一体化净水设备_一体化水处理设备-江苏旭浩鑫环保科技有限公司 | 非小号行情 - 专业的区块链、数字藏品行情APP、金色财经官网 | 广州监控安装公司_远程监控_安防弱电工程_无线wifi覆盖_泉威安防科技 | 电子书导航网_电子书之家_电子书大全_最新电子书分享发布平台 | 国际高中-国际学校-一站式择校服务-远播国际教育 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 广州小程序开发_APP开发公司_分销商城系统定制_小跑科技 | 机械立体车库租赁_立体停车设备出租_智能停车场厂家_春华起重 | 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 真丝围巾|真丝丝巾|羊绒围巾|围巾品牌|浙江越缇围巾厂家定制 | 三氯异氰尿酸-二氯-三氯-二氯异氰尿酸钠-优氯净-强氯精-消毒片-济南中北_优氯净厂家 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 |