2012-04-18 28 views
10

Tengo un WebView con html que contiene un formulario (publicación). Al hacer clic en un botón enviar, obtengo una respuesta JSON.¿Cómo puedo obtener la respuesta JSON de una solicitud POST en un WebView?

¿Cómo puedo obtener este JSON?

Si no intercepto la solicitud, el json se muestra en la vista web, así que supongo que debería usar shouldInterceptRequest (estoy usando la API 12), pero no sé cómo obtener el json.

¿O tal vez hay una manera mejor, como interceptar la respuesta en lugar de la solicitud?

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

Gracias

Respuesta

4

debe reemplazar el método de 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 También echa un vistazo a este How do I get the web page contents from a WebView?

+0

No funciona porque la url es la misma que la del formulario y con la solución obtengo el html con el formulario. En lugar de interceptar la solicitud, debería interceptar la respuesta antes de mostrarla en la vista web, o enviar la solicitud con los parámetros de publicación ... – jul

+0

Debe ignorar la página del formulario y ver la página siguiente cargando ... El documento dice "Da la aplicación de host tiene la oportunidad de hacerse cargo del control cuando una nueva url está a punto de cargarse en el WebView actual ". Por lo tanto, debe establecer un indicador cuando la carga del formulario se complete y atrapar la próxima carga inmediata que suceda ... – Ronnie

+0

No compare el URL ... establezca un indicador para saber cuándo se está cargando el formulario y cuándo se está cargando json .. – Ronnie

1

Bueno, la respuesta corta es que funciona bastante similar a shouldOverrideUrlLoading (vista WebView, String url), como se ilustra en el tutorial WebView.

Para comenzar, vea el siguiente código. Simplemente anula el método shouldInterceptRequest (vista de WebView, url de cadena) de su WebViewClient. Obviamente, usted no tiene que hacer eso en línea, pero en aras de la compacidad eso es lo que hice:

Tome un vistazo a this.

+0

He editado mi pregunta para mayor claridad. – jul

3

Aquí es cómo logró este como el método mencionado comenzó a quejarse de conexión de red de hilo de interfaz de usuario.

Usando ChromeWebView cliente y la consola de registrar la salida

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

} 

espero que ayuda a los demás.

+0

Esta es la solución más fácil y la que realmente funcionó para mí, para capturar una respuesta SAML JSON redirigida. Beneficio adicional: extremadamente simple y sin interconexión en red en la excepción de la interfaz de usuario. – AgentKnopf

Cuestiones relacionadas