如何使用 Http Post 从 WebView 中检索和修改 HTML 内容

Posted

技术标签:

【中文标题】如何使用 Http Post 从 WebView 中检索和修改 HTML 内容【英文标题】:How to retrieve and modify HTML content from WebView with Http Post 【发布时间】:2015-11-19 13:26:20 【问题描述】:

我正在开发一个显示 html 页面某些部分的 android 应用程序。第一步,我使用问题How to retrieve HTML content from WebView 中提供的代码。

完整的html图片

我想展示的那部分

/* An instance of this class will be registered as a javascript interface */
class MyJavaScriptInterface

    @SuppressWarnings("unused")
    public void processHTML(String html)
    
        // process the html as needed by the app
    


final WebView browser = (WebView)findViewById(R.id.browser);
/* JavaScript must be enabled if you want it to work, obviously */
browser.getSettings().setJavaScriptEnabled(true);

/* Register a new JavaScript interface called HTMLOUT */
browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

/* WebViewClient must be set BEFORE calling loadUrl! */
browser.setWebViewClient(new WebViewClient() 
    @Override
    public void onPageFinished(WebView view, String url)
    
        /* This call inject JavaScript into the page which just finished loading. */
        browser.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
    
);

/* load a web page */
browser.loadUrl("http://example.com/gethtml.html"); 

但是当用户点击第二张图片中的按钮时,将调用 HTTP post 方法,这将是结果 HTML

我的问题是如何在显示给用户之前检索和修改 Post Result Html?并显示类似的内容

【问题讨论】:

你试过JSoup吗? @Mohit 是的!但是 Post 方法很复杂,所以我宁愿不使用 JSoup :) 你试过postURL吗? @DrZIZO 任何链接?有什么例子吗? this 和 this 有很多 postURL 的示例,但我不知道它是否适合您 【参考方案1】:

一个简单的解决方案是在你的 webview 中注入自定义的 css 代码,改变你想要“单独”显示的 HTML 元素的样式。

你应该像这样注入一个 css:

#central-box 
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    width: 100%;
    // depends on the structure of the page

另请参阅in this answer,了解如何执行此操作的示例。

【讨论】:

所以我的问题是如何在向用户显示 HTML 之前注入这个 CSS? 我认为您至少应该尝试这种方式,因为不会太费时间。【参考方案2】:

我能想到至少有三种方法可以做到这一点,而且你真的很接近所有这些方法:

    您已经对@lifeisfoo 中的快速而肮脏的方法有了一个粗略的了解,尽管要处理 API 21 之前的 GET 和 POST,您需要使用 onPageCommitVisible(WebView view, String url)。由于 onPageFinished(WebView view, String url) 和 shouldOverrideUrlLoading (WebView view, String url) 仅在 GET 请求上触发。

这就是为什么,直接来自 SDK... ..."onPageCommitVisible 回调可用于确定使回收的 WebView 可见的安全点,确保不显示陈旧的内容。在可以保证的最早点调用它onDraw(Canvas) 将不再从以前的导航中绘制任何内容。下一次绘制将显示 WebView 的背景颜色,或新加载的页面的一些内容。" 它在所有内容更新 POST 时调用或 GET。

    稍微好一点,您可以创建一个本地代理网页,其中包含 javascript 界面和其他有趣的部分已经到位并存储为资源,如果您想要的内容加载到全窗口 iframe 中,您可以获得真正的良好的控制,您可以使用 onPageFinished 与您的代理进行交互,因为它位于 iframe 中,您可以使用 onLoadResource 与目标页面进行交互,使用返回 WebResourceResponse 的旧 shouldInterceptRequest 处理拦截,并使用 onFormResubmission 处理 POST 驱动的更新。

    最后,如果 API 支持早于 21 不是一个大问题,最好的方法是使用新的 shouldInterceptRequest,它采用新的 WebResourceRequest 对象,允许您为不同的请求类型指定不同的处理方式。

这是新 WebResourceRequest 对象和 WebViewClient 上的新 shouldInterceptRequest 方法的 API 链接...

http://developer.android.com/reference/android/webkit/WebResourceRequest.html

http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldInterceptRequest(android.webkit.WebView, android.webkit.WebResourceRequest)

希望有帮助:)

【讨论】:

以上是关于如何使用 Http Post 从 WebView 中检索和修改 HTML 内容的主要内容,如果未能解决你的问题,请参考以下文章

从 Android Webview 获取 POST 数据

QT中 如何让webView发送post请求?

UWP 拦截 Webview POST 请求并获取内容

如何在 Android 上的 webView 中显示视频

webview怎么获取拦截页面中的Post数据?

将 $_POST 数据发送到 Android Webview