ejemplo - Android Webview POST
webview android studio 2018 (4)
Estoy tratando de lograr algo bastante simple, pero no he encontrado una 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.
El proceso debe ser simple:
consulta (con datos POST) -> servidor web -> respuesta HTML -> WebView.
Puedo enviar datos usando un DefaultHttpClient, pero esto no se puede mostrar en un WebView.
¿Alguna sugerencia?
Muchas gracias
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");
}
Dos formas de cargar la respuesta de la publicación en la vista web:
webview.loadData()
: me gusta lo que ha publicado en su solución. Pero "el contenido cargado a través de este mecanismo no tiene la capacidad de cargar contenido de la red".webview.postUrl()
: Úselo si la respuesta de la publicación necesita cargar contenido de la red. (NOTA: solo se puede acceder desde api-level 5, lo que significa que no hay Android 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 )
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);
}
Recomendaría hacer esto como parte de una AsyncTask y actualizar la WebView luego
Si usa un WebView desde el principio, ¿podría funcionar?
Una vista web con html / js que hace el POST y, naturalmente, muestra el resultado.
Yo uso webView.loadData () para hacer la publicación del 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");
}
use la función webview_ClientPost ():
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);