Enviar una peticion http POST desde Android a aplicación web (php)

La comunicación desde aplicaciones en dispositivos mobiles con servidores en la internet, es prácticamente una necesidad, siendo cada vez mas común encontrar este comportamiento en aplicaciones, es necesario comprender como se realiza esta comunicación. Basicamente lo que haremos es enviar una petición POST, muy similar a subir una forma con el metodo post desde un documento HTML a una aplicación en PHP, solamente que lo haremos desde Android, y siendo Android un sistema que utiliza Java, lo haremos utilizando ciertas librerías que nos permiten realizar esta comunicación desde Java.

Codigo de actividad en android que implementa la clase httpHandler

Ejemplo de aplicación sencilla que implemente una comunicación con una aplicación en PHP.

Codigo de clase en Java a implementar en Android para enviar peticiones a servidor web:

En esta clase lo que hacemos es implementar la comunicación, aqui estas todo lo que se necesita para enviar la petición a PHP junto con información.

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

public class httpHandler {

  public String post(String posturl){

	  try {

		  HttpClient httpclient = new DefaultHttpClient();
/*Creamos el objeto de HttpClient que nos permitira conectarnos mediante peticiones http*/
		  HttpPost httppost = new HttpPost(posturl);
/*El objeto HttpPost permite que enviemos una peticion de tipo POST a una URL especificada*/
		  //AÑADIR PARAMETROS
		  List<NameValuePair> params = new ArrayList<NameValuePair>();
		  params.add(new BasicNameValuePair("data","Variable 1"));
		  params.add(new BasicNameValuePair("info","Otro mensaje"));
		/*Una vez añadidos los parametros actualizamos la entidad de httppost, esto quiere decir en pocas palabras anexamos los parametros al objeto para que al enviarse al servidor envien los datos que hemos añadido*/
  httppost.setEntity(new UrlEncodedFormEntity(params));

                  /*Finalmente ejecutamos enviando la info al server*/
		  HttpResponse resp = httpclient.execute(httppost);
		  HttpEntity ent = resp.getEntity();/*y obtenemos una respuesta*/

		  String text = EntityUtils.toString(ent);

		  return text;

	  }
	  catch(Exception e) { return "error";}

	}

}

 

Actividad en Android

En este codigo basicamente tenemos una actividad principal donde usamos una clase httpHandler para enviar una petición al servidor web.

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        httpHandler handler = new httpHandler();
        String txt = handler.post("http://192.168.0.19/app_android/app.php");

        TextView t = (TextView)findViewById(R.id.text1);
        t.setText(txt);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

 

Codigo en PHP:

EL codigo en PHP es lo mas sencillo, unicamente lo que hace es capturar información y regresarla, esta se captura como la “respuesta” desde Android.

<?php

	$dato = $_POST['data'];
	$info = $_POST['info'];
	echo $dato."\n".$info;
?>

 

Si deseas ver el proceso completo de como se creo este software te invito a ver los siguientes video tutoriales, donde implementamos este codigo.

Video tutorial para conectar Android con una aplicación en PHP

parte 1:

parte 2:

parte 3:

Acerca del autor:

Mi nombre es Jorge Villalobos, soy Colombiano de nacimiento y resido en México desde 2005,actualmente soy el creador de codigoprogramacion.com Soy ingeniero en tecnologías de información y comunicaciones y trabajo de tiempo completo desarrollando aplicaciones web. En general me considero un tipo normal, me gusta salir, divertirme, y uno de mis hobbies es programar y hacer tutoriales para compartir conocimiento, me gusta la pizza, el ajedrez y tomar una que otra cerveza los fines de semana. Espero que este proyecto ayude a ayudar a los demás.

Twitter del autor:

71 comments

  1. Slam says:

    Necesito la forma de mostrar en el navegador una pagina html básica hosteada desde android, sin usar otras aplicaciones.

  2. fredd says:

    Hola men eres una basura siempre tus codigos nunca funcionan

  3. Noé Nájera says:

    Jorch como se hace actualmente el proceso anterior. Tengo entendido que las librerías de apache ya están obsoletas.

  4. leonardo says:

    He revisado el codigo y los videos muchas veces y no logro que me funcione.
    Ni con el 2.2 API nivel 8 ni nada. El strictMode me pide nivel 9 o superior.
    Ya lo probé con 2.2 y 2.3 y nada. Siempre se va a el error.
    Alguien tiene el código completo funcionando ?

  5. Luna says:

    Hola, yo tengo una pagina web (mapa) y la agregue a una webview de forma local. Ahora lo que quiero hacer es que cuanod se habra mi pagina web en android y de clic en un marcador, me mande un msg con un Toast, pero no encuentro la forma de poder hacer esto…. Help me Please!

  6. Jesus says:

    Hola felicidades, tengo que grabar un archivo de audio en una base de datos mysql un campo blob. soy novato con android com puedo hacer esto ya pude grabar el audio en formato mp3 en el dispositivo movil, pero enviarlo me trae de cabeza me puedes dar algunas luces como hacer eso. Gracias.

  7. carlos says:

    hola, buen dia excelente material , tengo un pequino problema con la aplicacion de ejemplo. al ejecutarla en el emulador me muestra el mensaje de error del try cat de la clase HttpHandler.

    • sebastian says:

      Hola igualmente me pasa a mi hace días que que estoy luchando para hacerlo funcionar , y probé todo lo que creo debería , si lo resolviste o quieres unirte grandioso , te dejo mi sky : sebastian.tamay.arg . a cualquiera que quiera unirse y ayudar se lo agradeceremos . Basicamente hice todo como lo indica en el tuto y siempre solo me tira el error de que no conecta , y en el php si muestra un ” hola Sebastian”. Saludos.

  8. Manuel says:

    Felicidades!!!… muy buena explicacion. Un saludo y un fuerte abrazo desde Bolivia.

  9. Reiner says:

    Amigo, disculpa. Estoy haciendo un formulario de contacto en html y lo agregue a mi aplicacion con el webview, tengo el archivo php en un servidor y no se como hacer para que al presionar el boton enviar del formulario, la respuesta es un archivo pdf que se descarga automaticamente. Desde el PC todo funciona muy bien, hace lo que debe hacer, pero en android no se en q lugar poner codigo ni qué codigo agregar, soy nuevo en android.

  10. moises says:

    hola Jorge, yo también soy de Colombia, estoy intentando hacer una app de que guarde los datos en una mysql y desde el emulador funciona, pero al poner el apk en la tablet no funciona, me podrías ayudar? ademas me gustaría saber si me puedes desarrollar la aplicación y cuanto me cobras. escríbeme

    solo necesito la app que guarde los datos en una base de datos mysql con campos de texto radio y select. son unos 20 campos.

    ayúdame si puedes se termina el tiempo para entregarla y no logo que me funcione :(

    saludos

  11. Fernando says:

    Estimado, estoy trabajando con CouchBase Lite para Android. Quisiera saber cómo puedo enviar los documentos almacenados en la base de datos NoSQL hacia un servidor. Saludos!

  12. Javier says:

    Muy bueno!!, ¿Podrias hacer un curso de android para jsp y servlets ?, no entiendo muy bien los tutoriales de internet, y vos explicas muy bien, talvez con vos podria entender algo, muchas gracias!!!

  13. eduardo says:

    este tutorial solo sirve para las versiones inferiores a la 4

  14. alberth says:

    holas te cuento q no puedo realizar la conexion desde mi tablet solo sale el mensaje error.. ayudame porfa

  15. shina says:

    hola, antes que nada gracias, requiero enviar una imagen pero a servidor xmpp para ser precisa es openfire, me podrías auxiliar en como se haría esto? Estoy haciendo una aplicación de chat y quiero agregarle el envió de imagenes

  16. Luis says:

    alguien sabe como puedo mostrar esos datos en una pagina web. asi como lo muestra en el telefono

  17. Maribel Monzon says:

    Me encantan tus vídeos, el código y como lo explicas… Me han ayudado mucho en mi proyecto de fin de ciclo

    Podrías explicar como añadir en este caso un imagen que tenga en un imageview de mi activity? En realidad lo que quiero hacer es enviar la imagen y las coordenadas GPS a un sevidor para guardarlas.

    Gracia!!!!

  18. Osvaldo Ibarra says:

    Buenas tardes
    Estoy utilizando APP INVENTOR 2, y quiero enviar unos datos a una pagina PHP, pero no logro conectar esa informacion, e encontrado que se requiere utilizar JSON, herramienta para que la base de datos en PHP pueda recibir la informacion, pero no logro ver la info en la pagina o mas bien ni la recibe. sabes de alguna otra forma., saludos

  19. Diego says:

    hola, buen tuto pero quisiera que me saliera en mi telefono-tablet(android 4.0) en el emulador si sale todo bien, ¿como se podría hacer?.

  20. mobius says:

    Buen tutorial me funciono pero hace la peticion cuando carga la aplicacion y para hacer la peticion cuando pulso un boton he intentado peor no he tenido exito se cierra la aplicacion recien estoy aprendiendo android gracias

  21. Andres says:

    Al correrlo me lanza android.os.NetworkOnMainThreadException.
    Alguna ayuda de por qué esta excepción?
    (permiso de Internet agregado)

  22. carlos says:

    olap lo que pasa es que me retorna error a correr la aplicacion me gustaria saber como hago para no retornar el mensaje de error sino el motivo del error te lo agradeceria

  23. juan Manuel says:

    Ademas me pone siempre delante del texto unos caracteres extraños: i<<¿

  24. juan Manuel says:

    Buenos dias, el tutorial va bastante bien, pero los datos que mando de android a php no me funciona

  25. juan Manuel says:

    Buenos dias, estoy probando este tutorial y me funciona correcto leer lo que hay en el Php, me no me envia los datos de android al php.

    Ayuda Please

  26. johan says:

    StrictMode.enableDefaults();
    hay que colocar esta linea en oncreate y listo funciona el programa

  27. daniel says:

    es igual con el metodo get , solo lo cambio a HttpGet , si sera asi

  28. Mauricio says:

    Al parecer no sirve!

  29. dirubex says:

    No me funciona, me sale error (del return error).

  30. carlos says:

    Funciona para android 4 en adelante???, porque a mi no me
    Funciona, solo en android 2.3 e inferior

  31. Fabian says:

    Hola, tengo una problema, que supongo ha varios les ha ocurrido, me parece que el código es correcto, pero al igual que a varios dice que tengo que dar permiso de la carpeta, que permisos debo dar? y cual carpeta exactamente? por favor solo me faltaría eso para implementar lo demás, gracias de antemano.
    Saludos.

  32. M. Angel says:

    Alguna idea de como leer los nombres de los archivos en una carpeta de un servidor, esto como para poner una lista de imagenes en una app android tomadas del servidor.

  33. Jose Didier Reynosa Lopez says:

    tengo un error en el HttpResponse resp = httpclient.execute(httppost);

    podrias decirme o explicarme si es que necesito una version en especia o si mi direccion esta mal o no se espero pronto tener alguna solucion saludos

  34. Paco says:

    Muchas gracias!!!, muy buen aporte, me ha ayudado mucho, una pregunta, ¿cómo podría mandar una petición post a páginas https?, ingrese la página de android pero la verdad no me queda claro:

    KeyStore keyStore = …;
    String algorithm = KeyManagerFactory.getDefaultAlgorithm();
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(algorithm);
    kmf.init(keyStore);

    SSLContext context = SSLContext.getInstance(“TLS”);
    context.init(kmf.getKeyManagers(), null, null);

    URL url = new URL(“https://www.example.com/”);
    HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
    urlConnection.setSSLSocketFactory(context.getSocketFactory());
    InputStream in = urlConnection.getInputStream();

    Me podrías ayudar xfa!!!?, muchas gracias por atención.

    Saludos!

  35. Andrés says:

    Hola Jorge,

    Buen post, ¿Como se podria modificar el codigo inicial para que también permita subir archivos? Por ejemplo una imagen JPG.

    Hace dias que busco una solución a ese problema.

    Gracias!

  36. leo says:

    hola disculpa tengo un error en el php que no se por que en un código tan sencillo me sale Notice: Undefined index: data in C:\wamp\www\app.php on line 2

  37. David says:

    Hola, gracias por este tutorial, no se si puedas extenderlo un poco más para darnos una idea de como enviar los datos desde el móvil y almacenarlos en la base de datos gracias!!

    • Eleasin says:

      Hola Jorge… si seria bueno lo que menciona David, podrias hacer un tuto con algo relacionado con envio de datos desde el móvil como datos recibidos por acelerometro o bluetooth, enviarlos al lenguaje web y almacenarlos en una base de datos!… saludos!

      • Sam says:

        Hola Jorge, acá también te agradecería mucho un tuto con el envío de datos tipo sensor o gps desde el móvil a una base de datos en un servidor remoto! he intentado con varias estructuras y nada..

  38. Manuel says:

    Que tal buen día, excelente tutorial, disculpa e seguido al pie de la letra el tutorial pero me arroja error! tengo el php en un servidor web! podrías ayudarme de favor?

  39. jose ballesteros says:

    Hola tengo una pregunta estoy accediendo a una base de datos en phpmyadmin y todo me ha funcionado pero tengo una duda les agradecería su ayuda, en lo siguiente al igual que en la explicación mi php me esta enviando la siguiente respuesta:

    echo $outputdata[0][0].”\r\n”.$outputdata[0][1].”\r\n”.$outputdata[0][2].”\r\n”.$outputdata[0][3].”\r\n”.$outputdata[0][4].”\r\n”.$outputdata[0][7].”\r\n”.$outputdata[0][8].”\r\n”.$outputdata[0][9];

    pero como se ve en el programa:

    String txt = handler.post(“http://192.168.0.19/app_android/app.php”);
    TextView t = (TextView)findViewById(R.id.text1);
    t.setText(txt);

    se coloca toda la información en un solo TextView. Lo que quisiera es colocar cada $outputdata[x][x] en un TextView diferente agradecería su ayuda.

  40. Ana says:

    Hola! Muchisimas gracias por los videos, me vienen muy bien para mi proyecto fin de carrera. Lo he hecho y me van todos perfectos ;)
    Pero tengo una duda, en la clase httpHandler, se envian al php los datos “Variable 1″ y “Otro mensaje”.
    Yo lo que quiero es enviar al php una variable que reciba en el mismo archivo.
    Ayudame por favor. No se cómo recibir esa variable ni como enviarla al archivo php para que desde ahi me busque con esa variable en la base de datos mysql.

    Gracias por tus videos! Eres un crack!

  41. Valentin says:

    Hola, te cuento que utilicé sólo hasta el segundo video, pero siempre me sale error, ya sea en el emulador o en el teléfono. He probado con 127.0.0.1, con 10.0.0.2 y no ha cambiado nada. No se cuál puede ser el problema.

    La parte de dar permisos a la carpeta donde está el .php cómo se hace ?
    Espero tu respuesta.
    Muchas gracias

  42. OSCAR MORALES says:

    Ami si me funciona desde el emulador, el problema es cuando lo paso al teléfono, me muestra el “ERROR” del catch.

    Has un vídeo para insertar datos a la base de datos desde el móvil.

  43. Marcos says:

    Gracias, pero no me funciona… el emulador Android siempre me muestra ERROR… creo que el problema es la conexión con mi servidor Apache (XAMPP). Probé poner como IP 127.0.0.1 ò 10.0.2.2 o mi IP… pero nada sigue diciendo ERROR; qué puede suceder?.
    Gracias

  44. camiza says:

    Muy buenos los tutos, que bueno que pudieras explicar algo sobre el formato JSON.

  45. Nadin Yamaui says:

    Hola excelentes tutoriales pero no me esta funcionando la conexion http no sabes porque estara pasando esto? el problema esta en esta linea
    HttpResponse response = client.execute(post);

    • Alejandro Alvarez says:

      igualmente, el error esta en esa línea… en mi caso. Capture el error y es: “android.os.NetwortkOnMainThradException” no se si a Nadim le sale lo mismo? por si acaso estoy trabajando con wampServer2

      • marcos says:

        prueba cambiando en manifest la versión de sdk, que quede así:

        por alguna razón me funcionó…. ahh y recuerda dar permiso de conexión a internet

        saludos

      • Sam says:

        Cambiando a la versión 2.2 y utilizando API 8 como te sugirieron me funcionó también…

        qué cambios se deberían hacer para que funcionara en versiones superiores??

        • Jose says:

          Tengo un problema igual cree un programa hace un tiempo con estos comandos y lo probé en una tablet con 2.2 en ese tiempo todo bien pero ahora intento probar en un equipo con 4.2 y no me funciona el httphandler se va directo al error

          catch (Exception e){
          return “error”;
          }

          • Pepe U says:

            Como se menciona en un comentario anterior, agrega al codigo del MainActivity dentro del onCreate esto StrictMode.enableDefaults();
            A mi me funciona utilizando

Leave a Reply

Your email address will not be published. Required fields are marked *