Android 如何在WebView中获取POST请求的JSON响应?

Android 如何在WebView中获取POST请求的JSON响应?,android,json,post,android-webview,Android,Json,Post,Android Webview,我有一个WebView,其中html包含一个表单(post)。当单击某个提交按钮时,我得到一个JSON响应 我怎样才能得到这个JSON 如果我没有拦截请求,json将显示在webview上,因此我想我应该使用shouldInterceptRequest(我使用的是API 12),但我不知道如何在其中获取json 或者有更好的方法,比如拦截响应而不是请求 mWebView.loadUrl(myURL); isPageLoaded = false; // used because the ur

我有一个
WebView
,其中html包含一个表单(post)。当单击某个提交按钮时,我得到一个JSON响应

我怎样才能得到这个JSON

如果我没有拦截请求,json将显示在webview上,因此我想我应该使用
shouldInterceptRequest
(我使用的是API 12),但我不知道如何在其中获取json

或者有更好的方法,比如拦截响应而不是请求

mWebView.loadUrl(myURL);  

isPageLoaded = false; // used because the url is the same for the response

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest (WebView view, String url) {

        if(isPageLoaded){
            // get the json
            return null;
        }
        else return super.shouldInterceptRequest(view, url);
    }

    public void onPageFinished(WebView view, String url) {
        isPageLoaded = true;
    }
});
谢谢

简而言之,它的工作原理与 shouldOverrideUrlLoading(WebView视图,字符串url),如中所示 WebView教程

要开始,请参阅下面的代码。您只需覆盖 您的应用程序的shouldInterceptRequest(WebView视图,字符串url)方法 WebViewClient。显然,您不必内联执行此操作,但对于 为了紧凑,我就是这么做的:


请看。

您应该重写
WebViewClient的
shouldOverrideUrlLoading
方法

@Override
public boolean shouldOverrideUrlLoading (WebView view, String url) {

    if(flag) { 

            URL aURL = new URL(url); 
            URLConnection conn = aURL.openConnection(); 
            conn.connect(); 
            InputStream is = conn.getInputStream(); 
            // read inputstream to get the json..
            ...
            ...
            return true;
    }

    return false
}

@override
public void onPageFinished (WebView view, String url) {
    if (url contains "form.html") {
        flag = true;
    }
}

也看看这个

这里是我如何做到这一点的,因为提到的方法开始抱怨UI线程网络连接

使用ChromeWebView客户端和控制台记录输出

    public void OnSignUp_Click(View v) {
    WebView mWebview = new WebView(this);

    mWebview.getSettings().setJavaScriptEnabled(true); // enable javascript

    final Activity activity = this;

    mWebview.setWebChromeClient(new WebChromeClient() {
        public boolean onConsoleMessage(ConsoleMessage cmsg)
        {

                /* process JSON */
            cmsg.message();
            return true;

        }
    });

    mWebview.setWebViewClient(new WebViewClient() {

        public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl) {
            Log.e("Load Signup page", description);
            Toast.makeText(
                    activity,
                    "Problem loading. Make sure internet connection is available.",
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            view.loadUrl("javascript:console.log(document.body.getElementsByTagName('pre')[0].innerHTML);");
        }
    });

    mWebview.loadUrl("https://yourapp.com/json");

}

希望它能帮助其他人。

它不起作用,因为url与表单中的url相同,而通过您的解决方案,我可以从表单中获得html。我应该在webview中显示响应之前拦截响应,而不是拦截请求,或者使用post参数发送请求…您应该忽略表单页面并捕获下一个页面加载。。。文档说“当一个新的url即将加载到当前WebView中时,主机应用程序有机会接管控制权。”因此,当表单加载完成时,您应该设置一个标志,并捕捉下一次加载。不要比较url。。设置一个标志来知道表单何时加载以及json何时加载。有没有截获响应的方法?看看这篇文章,这是迄今为止最简单的解决方案,也是对我来说最有效的解决方案,用于捕获重定向的SAML json响应。附加好处:非常简单,在UI上没有网络异常。