Muchas aplicaciones necesitan solicitar algún servicio a algún servidor que provea la información solicitada por el usuario, ya sea una página web, canciones, imágenes, vídeos, etc. Para poder realizar estas peticiones, el protocolo más utilizado en Internet es el HyperText Transfer Protocol, más conocido por sus siglas «http«.
Una de las formas de implementar la comunicación cliente-servidor con la API de Android es mediante la clase HttpURLConnection, que con unas pocas líneas de código podemos hacer un cliente http totalmente configurable.
Puedes hacer una clase similar a la que muestro a continuación:
public String clienteHttp(String dir_web) throws IOException{ Sting dir_web = " "; String body = " "; try { URL url = new URL(dir_web); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); Integer codigoRespuesta = Integer.toString(urlConnection.getResponseCode()); if(codigoRespuesta.equals("200")){//Vemos si es 200 OK y leemos el cuerpo del mensaje. body = readStream(urlConnection.getInputStream()); } urlConnection.disconnect(); } catch (MalformedURLException e) { body = e.toString(); //Error URL incorrecta } catch (SocketTimeoutException e){ body = e.toString(); //Error: Finalizado el timeout esperando la respuesta del servidor. } catch (Exception e) { body = e.toString();//Error diferente a los anteriores. } return body; }
Pasos a seguir:
- Crea un objeto de la clase HttpURLConnection, que se conectará a la URL especificada en dir_web (por ejemplo «https://borrowbits.com»).
- Con el método getResponseCode() puedes ver el código de estado http devuelto, para saber si se ha podido procesar bien la petición o ha habido algún error (en el cliente o en el servidor).
- Si el código es «200 OK», es que todo ha ido bien y puedes obtener la respuesta recibida con el método readStream().
Puedes dejarte los ojos buscando este método en la web de Android Developers que no lo vas a encontrar, pero te lo ponen de ejemplo en el apartado en el que explican la clase HttpURLConnection y no especifican que esta clase te la tienes que currar tú mismo, que no existe tal cual en la API. Tranquilos, si os vale de ayuda, os pongo a continuación la que utilizo yo. - Si hay algún error durante la petición, puedes gestionarlo para saber qué ha pasado (en el ejemplo sólo se contemplan dos casos, pero puede haber muchos más).
- También puedes configurar el objeto de la clase HttpURLConnection (al que hemos llamado urlConnection) con un gran número de métodos que nos permiten por ejemplo decidir si el método será GET (por defecto) o POST con urlConnection.setDoOutput(true), también se pueden configurar los temporizadores utilizados en la conexión, como por ejemplo el de establecimiento de conexión con urlConnection.setConnectTimeout(2000) y muchos más elementos que desees ajustar.
El método para recibir el streaming de la respuesta del servidor (o response) que se ha utilizado en el ejemplo es el siguiente:
private String readStream(InputStream in) throws IOException{ BufferedReader r = null; r = new BufferedReader(new InputStreamReader(in)); StringBuilder total = new StringBuilder(); String line; while ((line = r.readLine()) != null) { total.append(line); } if(r != null){ r.close(); } in.close(); return total.toString(); }
Ya puedes incluir esta herramienta en tu aplicación para que pueda interactuar con el resto de Internet. Cualquier mejora que quieras sugerir o comentario, ¡siempre será bienvenido!
Hola, gracias por el ejemplo, pero me gustaría que me puedas orientar para saber que metodo puedo utilizar para enviar datos desde mi aplicación de android y almacenarla en una base de datos que este en el servidor. De momento guardo los datos en una base de datos en el telefono, pero ahora quiero guardar esa información en una DB externa. Gracias
Hola David,
Para poder conectarte a una base de datos en un servidor remoto puedes utilizar una base de datos basada en SQL, como MySQL. Encontrarás mucha información en Internet para poder instalarla, configurarla y prepararla para las peticiones remotas. Básicamente lo que haces con tu dispositivo Android es conectarte mediante el protocolo HTTP a tu servidor (es como si te conectaras a una web, generalmente escrita en .php) que atiende las peticiones y devuelve las consultas.
Para empezar puedes ver estos dos ejemplos en los que te detallan el proceso y te ponen ejemplos funcionales:
http://www.androidhive.info/2012/01/android-login-and-registration-with-php-mysql-and-sqlite/
http://www.helloandroid.com/tutorials/connecting-mysql-database
Puedes utilizar el ejemplo que he puesto en el artículo como el «medio» para enviar y recibir las respuestas a tu base de datos utilizando el protocolo HTTP.
Si en lugar de querer utilizar una base de datos remota, prefieres utilizar una base de datos local en tu dispositivo, hay una clase diseñada para ese fin:
http://developer.android.com/training/basics/data-storage/databases.html
Espero que estos enlaces te sirvan de ayuda.
¡Un abrazo!
Gracias Rafa
me parece que es lo que estaba buscando , Estoy diseñando una aplicacion (server) en una tablet i otra para moviles , tienen que recoger los datos de la server y devolverlos .
Voy bien ?
Gracias
Hola Ferrán,
En el comentario contestando a David puse algunas webs que explican como hacer eso. Ya depende de cómo lo quieras diseñar. En el blog puedes encontrar cómo hacer un Servidor de HTTP con código Java, que atienda las peticiones HTTP, pero si quieres hacer algo más sencillo puedes usar algún servidor web existente como Apache o Tomcat.
Saludos
Hola. que tal a todos? espero que bien. Yo solo escribo para agradecer el codigo fuente, ya que me ha sido de total utilidad, ademas como es solo 1 practica de coneccion y transferencia de datos minima no lo he tenido que modificar mucho para implementarlo. Bueno, muchas gracias por todo.
Hola Pablo,
Me alegro de que te haya sido de utilidad. Si has realizado alguna mejora, no dudes en compartirla con nosotros.
Un abrazo
Hola, he utilizado tu código complementándolo con un Thread y funciona bien, el problema lo tengo al intentar acceder al mismo fichero alojado en el dropbox, creo que es debido al protocolo de seguridad, ya que utiliza el https, sabes como acceder a un fichero alojado en el dropbox, estoy buscando por la red peor veo muy poca información al respecto.
Saludos.
Hola. Gracias por el articulo.
Una duda, ¿cómo envío una imagen al servidor? Se como subir texto, pero no se cómo el servidor recibe la imagen, para poder guardarla en la ruta correspondiente. Gracias de antemano.
Quiero creer que esto serviría para saber si cierta dirección esta o no esta funcionando correctamente? Como si le estuviera mandando un ping para recibir respuesta. Necesito saber en mi app si algunas direcciones están funcionando correctamente…me funcionara aplicar tu solución?