实现Android WebView拦截并获取POST请求参数的两种方法

2 下载量 115 浏览量 更新于2024-08-29 收藏 268KB PDF 举报
本文主要讨论的是在Android应用中如何拦截并获取嵌入的WebView内部POST请求参数的问题。当开发者需要在自家APP中监控嵌入的非自家控制的H5页面请求,而又不想让H5察觉时,通常会遇到获取POST请求参数的挑战。文章提供了两种实现方案来解决这个问题。 方案一:直接拦截所有请求 开发者最初的想法是设置一个自定义的`WebViewClient`,通过`shouldInterceptRequest`方法尝试访问`WebResourceRequest`中的URL,但这只能捕获GET请求,因为POST请求的参数通常被包含在请求体中,而不是URL中。这种方法对于POST请求是无效的,因为它无法解析请求体。 ```java webView.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { try { URL url = new URL(request.getUrl()); // ...其他处理逻辑 } catch (MalformedURLException e) { e.printStackTrace(); } return super.shouldInterceptRequest(view, request); } }); ``` 方案二:注入JavaScript代码实现 面对GET请求的局限性,作者找到了另一个解决方案。他们建议通过在H5页面中注入一段JavaScript代码,利用XMLHttpRequest对象的异步特性,每次发送Ajax请求时触发Android原生代码。具体步骤如下: 1. 在H5页面中编写JavaScript函数,如`generateRandom`用于生成随机ID,确保请求ID的唯一性。 2. 注入JavaScript,例如在`<head>`或`<body>`标签内添加以下代码: ```html <script> function generateRandom() { return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); } // 保持请求异步,确保与open和send的同步性 let requestID = null; function handleAjaxRequest() { if (requestID !== null) { // 发送POST请求时,将参数和请求ID传递给Android原生 const params = { /* H5请求参数 */ }; sendRequest(requestID, params); } } function sendRequest(id, params) { // ...实际的Ajax发送代码,这里省略 requestID = id; // ...后续Ajax代码 } </script> ``` 然后,在H5代码中,每当发起一个异步的`open`和`send`请求时,`handleAjaxRequest`函数会被触发,从而能够访问到POST请求的参数,并将其传递给Android应用。 总结来说,这篇文章提供了一种间接的方式来解决在Android中拦截并获取WebView内部POST请求参数的问题,通过JavaScript代码与原生代码的交互实现了对POST请求参数的监控,同时保持了对H5的透明性。