Как я могу получить ответ 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. Очевидно, вам не нужно делать это, но для ради того, что я сделал:
Посмотрите .