2012-04-18 2 views
10

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

Как я могу получить этот 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; 
    } 
}); 

Благодаря

ответ

4

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

Также посмотрите на эту How do I get the web page contents from a WebView?

+0

Это не работает, потому что URL-адрес совпадает с адресом с формой, и с вашим решением я получаю html с формой. Вместо того, чтобы перехватывать запрос, я должен перехватить ответ перед его отображением в веб-просмотре или отправить запрос с параметрами post ... – jul

+0

Вы должны проигнорировать страницу формы и поймать загрузку следующей страницы ... В документе говорится: «Дает приложение-хозяин получит возможность захватить элемент управления, когда новый URL-адрес будет загружен в текущем WebView ». Таким образом, вы должны установить флаг при завершении загрузки формы и уловить следующую следующую загрузку. – Ronnie

+0

Не сравнивайте URL. Установите флаг, чтобы узнать, когда форма загружается и когда json загружается. – Ronnie

1

Ну, короткий ответ, что он работает очень похож на shouldOverrideUrlLoading (вид WebView, String URL), как показано на WebView учебник.

Чтобы начать сотрудничество, см. Код ниже. Вы просто переопределяете метод shouldInterceptRequest (WebView view, String url) вашего Web-клиента . Очевидно, что вы не должны делать это инлайн, но для ради компактности вот что я сделал:

Посмотрите на this.

+0

Я отредактировал мой вопрос для большей ясности. – jul

3

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

Использование Client 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"); 

} 

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

+0

Это, безусловно, самые простые решения и тот, который действительно работал для меня, для того, чтобы поймать перенаправленный ответ SAML JSON. Дополнительное преимущество: Исключительно простое и не исключение Networking on UI. – AgentKnopf

Смежные вопросы