Как я могу получить ответ JSON запроса POST в WebView?

У меня есть WebView с html, содержащий форму (сообщение). При нажатии кнопки отправки я получаю ответ JSON.

Как я могу получить этот JSON?

Если я не перехватываю запрос, json отображается в веб-представлении, поэтому я предполагаю, что я должен использовать 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;
    }
});

Спасибо

Ответ 1

Вы должны переопределить метод 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?

Ответ 2

Вот как я достиг этого, так как упомянутый метод начал жаловаться на сетевое подключение потока пользовательского интерфейса.

Использование ChromeWebView Client и консоли регистрирует вывод

    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");

}

Надеюсь, что это поможет другим.

Ответ 3

Ну, короткий ответ заключается в том, что он очень похож на shouldOverrideUrlLoading (представление WebView, строковый URL-адрес), как показано в учебник WebView.

Чтобы начать работу, см. код ниже. Вы просто переопределяете mustInterceptRequest (метод просмотра WebView, String url) WebViewClient. Очевидно, вам не нужно делать это, но для ради того, что я сделал:

Посмотрите .