17

我有一个WebView包含表单(帖子)的带有 html 的内容。单击某个提交按钮时,我得到一个 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;
    }
});

谢谢

4

3 回答 3

11

你应该重写的shouldOverrideUrlLoading方法WebViewClient

@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;
    }
}

另请查看如何从 WebView 获取网页内容?

于 2012-04-22T14:25:16.633 回答
10

这是我如何实现这一点的,因为提到的方法开始抱怨 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");

}

希望它可以帮助别人。

于 2014-01-17T07:08:06.350 回答
-1

嗯,简短的回答是它的工作方式与 shouldOverrideUrlLoading(WebView view, String url) 非常相似,如 WebView 教程中所示。

为了让您开始,请参阅下面的代码。您只需覆盖 WebViewClient 的 shouldInterceptRequest(WebView view, String url) 方法。显然,您不必内联执行此操作,但为了紧凑起见,这就是我所做的:

看看这个

于 2012-04-18T16:23:25.327 回答