2012-04-18 22 views
10

Ho uno WebView con html contenente un modulo (post). Facendo clic su un pulsante di invio ottengo una risposta JSON.Come posso ottenere la risposta JSON di una richiesta POST in una WebView?

Come posso ottenere questo JSON?

Se non intercetto la richiesta, JSON viene visualizzato nella visualizzazione Web, quindi suppongo che dovrei usare shouldInterceptRequest (sto usando l'API 12), ma non so come ottenerlo.

O forse c'è un modo migliore, come intercettare la risposta invece della richiesta?

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

Grazie

risposta

4

È necessario eseguire l'override del metodo di 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; 
    } 
} 

shouldOverrideUrlLoading Anche prendere un'occhiata a questo How do I get the web page contents from a WebView?

+0

Non funziona perché l'url è uguale a quello con il modulo, e con la tua soluzione ottengo l'html con il modulo. Invece di intercettare la richiesta, dovrei intercettare la risposta prima di visualizzarla nella webview, o inviare la richiesta con i parametri del post ... – jul

+0

Dovresti ignorare la pagina del modulo e prendere il successivo caricamento della pagina ... Il documento dice "Gives l'applicazione host ha la possibilità di assumere il controllo quando un nuovo url sta per essere caricato nella WebView corrente. " Quindi dovresti impostare un flag quando il caricamento del modulo è completo, e prendere immediatamente il prossimo caricamento che accade .. – Ronnie

+0

Non confrontare l'URL .. imposta un flag per sapere quando il modulo si sta caricando e quando json sta caricando .. – Ronnie

1

Beh, la risposta breve è che funziona abbastanza simile a shouldOverrideUrlLoading (vista WebView, stringa URL), come illustrato nella tutorial WebView.

Per iniziare, vedere il codice qui sotto. È sufficiente sovrascrivere il metodo shouldInterceptRequest (visualizzazione Web, String URL) del proprio WebViewClient . Ovviamente non c'è bisogno di farlo in linea, ma per il bene di compattezza questo è quello che ho fatto:

Date un'occhiata a this.

+0

Ho modificato la mia domanda per maggiore chiarezza. – jul

3

Ecco come ho raggiunto questo come il metodo di cui ha iniziato a lamentarsi di connessione di rete thread dell'interfaccia utente.

Utilizzando ChromeWebView client e console log l'uscita

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

} 

Speranza che aiuta gli altri.

+0

Questa è di gran lunga la soluzione più semplice e quella che ha funzionato per me, per la cattura di una risposta JSON SAML reindirizzata. Vantaggio aggiuntivo: estremamente semplice e senza rete sull'eccezione dell'interfaccia utente. – AgentKnopf

Problemi correlati