Android开发:如何从EngineSession爬取其显示JSON对应的HTML内容?
解决EngineSession获取渲染内容的方案
1. 自定义EngineSession扩展(适用于可修改引擎实现的场景)
如果EngineSession是项目自定义组件或引擎支持扩展,直接添加类似WebView的JS执行接口:
- 在EngineSession实现类中新增方法:
public void evaluateJavascript(String script, ValueCallback<String> callback) { // 内部执行JS脚本,直接获取页面文本或HTML String content = internalExecuteJs(script); callback.onReceiveValue(content); } - 调用时执行
engineSession.evaluateJavascript("document.body.textContent", callback),直接拿到渲染的JSON文本。
2. 拦截引擎网络请求(最直接的原始JSON获取方式)
既然展示的是纯JSON,引擎必然先发起网络请求获取数据,直接拦截请求拿到原始JSON:
- 若引擎使用OkHttp等可拦截的网络库,添加拦截器:
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(chain -> { Response response = chain.proceed(chain.request()); // 读取响应体的原始JSON String rawJson = response.body().string(); // 保存JSON到业务逻辑层(注意重新构建响应体,因为body.string()仅可调用一次) return response.newBuilder() .body(ResponseBody.create(rawJson, response.body().contentType())) .build(); }) .build(); - 将配置好的客户端传入EngineSession,在请求阶段直接获取JSON,无需从渲染层提取。
3. 利用导出功能的间接提取(应急方案)
虽然requestPrintContent()或requestPdfToDownload()无法直接获取HTML,但可解析导出内容反向提取JSON:
- 触发导出请求,获取文档流后解析文本内容(因渲染的是纯JSON,导出内容即为纯文本格式);
- 该方式效率较低,仅适合临时应急场景。
4. 替换为WebView(备选方案)
若以上方法均不可行,直接替换为WebView,使用熟悉的evaluateJavascript():
webView.evaluateJavascript("document.body.textContent", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // 处理获取到的JSON内容 } });
内容的提问来源于stack exchange,提问作者Taslim Oseni
相关产品推荐
相关产品推荐

