2010-08-12 21 views
42

Estoy tratando de lograr algo bastante simple, pero no he encontrado ninguna buena documentación sobre esto. Tengo una vista web, y necesito cargar una página que requiera datos POST. Parece un proceso simple, pero no puedo encontrar una manera de mostrar el resultado en una vista web.Android Webview POST

El proceso debe ser simple:

consulta (con datos POST) -> servidor web -> respuesta HTML -> WebView.

Puedo enviar datos utilizando un DefaultHttpClient, pero esto no se puede mostrar en una WebView.

¿Alguna sugerencia?

Gracias mucho por

Solución

private static final String URL_STRING = "http://www.yoursite.com/postreceiver"; 

    public void postData() throws IOException, ClientProtocolException { 

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("foo", "12345")); 
     nameValuePairs.add(new BasicNameValuePair("bar", "23456")); 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(URL_STRING); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     HttpResponse response = httpclient.execute(httppost); 
     String data = new BasicResponseHandler().handleResponse(response); 
     mWebView.loadData(data, "text/html", "utf-8"); 
    } 

Respuesta

15

Prueba esto:

private static final String URL_STRING = "http://www.yoursite.com/postreceiver"; 

public void postData() throws IOException, ClientProtocolException { 

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
    nameValuePairs.add(new BasicNameValuePair("foo", "12345")); 
    nameValuePairs.add(new BasicNameValuePair("bar", "23456")); 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(URL_STRING); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

    HttpResponse response = httpclient.execute(httppost); 

} 

Yo recomendaría hacer esto como parte de un AsyncTask y actualizar la vista Web después

+0

Tengo un código bastante similar a esto, pero no tengo idea de cómo relacionarlo con un WebView. Si no es demasiado problema, ¿podría publicar un fragmento de una WebView utilizando este fragmento de código? Gracias –

+0

Una vez que tenga los datos, ¿solo desea mostrar los resultados en 'WebView', o desea que el usuario continúe haciendo clic en los enlaces? Creo que una vez que cargas los datos de un 'String' no puedes interactuar con él. Elabora un poco más.;-) – TJF

+0

Todo lo que realmente quiero hacer es enviar datos POST hacer una página, y luego mostrar la página resultante al usuario –

2

Si utiliza una vista Web desde el principio podría funcionar?

Una vista web con un html/js que hace el POST y, naturalmente, muestra el resultado.

+0

¿Cómo haré eso? –

142

dos maneras de cargar la respuesta posterior en vista web:

  1. webview.loadData() : Me gusta lo que has publicado en tu solución. Pero "el contenido cargado a través de este mecanismo no tiene la capacidad de cargar contenido de la red".

  2. webview.postUrl(): Úselo si la respuesta de la publicación necesita cargar contenido de la red. (NOTA: sólo es accesible desde api-nivel 5, lo que significa no androide 1,6 o inferior)


String postData = "username=my_username&password=my_password"; 
webview.postUrl(url,EncodingUtils.getBytes(postData, "BASE64")); 

(fuente: http://www.anddev.org/other-coding-problems-f5/webview-posturl-postdata-t14239.html)

+0

Creo que esta es la mejor manera de hacerlo. ¿Pero qué hay de subir un archivo de imagen? ¿Podría hacerse con este método? – leninyee

+8

@tarkeshwar Increíble. SO está lleno de soluciones largas y [engorrosas] (http://stackoverflow.com/questions/1652850/android-webview-cookie-problem/2349340#2349340) a medio hacer que requieren [por separado] (http: // stackoverflow. com/questions/5716898/set-a-cookie-to-a-webview-in -roid/5717294 # 5717294) manejo y administración de cookies, y aquí viene, publicando una solución que lo hace todo con solo 2 líneas. Te habría votado +100, pero SO solo permite +1. En mi humilde opinión, esta debería ser la respuesta aceptada. ¡Gracias por ahorrarme mucho tiempo! – ateiob

+2

Respuesta genial y elegante. – Tomasz

11

utilizo webView.loadData() para hacer puesto cliente, y se mostrará el contenido de la URL, mi código:

public static void webview_ClientPost(WebView webView, String url, Collection< Map.Entry<String, String>> postData){ 
    StringBuilder sb = new StringBuilder(); 

    sb.append("<html><head></head>"); 
    sb.append("<body onload='form1.submit()'>"); 
    sb.append(String.format("<form id='form1' action='%s' method='%s'>", url, "post")); 
    for (Map.Entry<String, String> item : postData) { 
     sb.append(String.format("<input name='%s' type='hidden' value='%s' />", item.getKey(), item.getValue())); 
    } 
    sb.append("</form></body></html>"); 

    webView.loadData(sb.toString(), "text/html", "UTF-8");  
} 

uso webview_ClientPost función():

Map<String, String> mapParams = new HashMap<String, String>();  
mapParams.put("param1", "111"); 
mapParams.put("param2", "222"); 

Collection<Map.Entry<String, String>> postData = mapParams.entrySet(); 

webview_ClientPost(webView1, "http://www.yoursite.com/postreceiver", postData); 
+0

'org.apache.http.util.EncodingUtils' está en desuso, por lo que esta es la mejor solución – Lokesh