Aprende Android: crea un cliente HTTP con HttpURLConnection

Aprende Android: crea un cliente HTTP con HttpURLConnection

http¿Estás desarrollando una aplicación para Android? ¿Necesitas que tu aplicación se comunique con algún servidor solicitándole algún servicio y gestionar la respuesta recibida? Sí ese es tu caso, puede que estas líneas te interesen.

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:

  1. Crea un objeto de la clase HttpURLConnection, que se conectará a la URL especificada en dir_web (por ejemplo “https://borrowbits.com”).
  2. 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).
  3. 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.
  4. 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).
  5. 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!

Previous Nichos de mercado: cómo saber si tu idea es viable
Next Nuevos canales de venta para productos frescos

About author

Rafa M.
Rafa M. 51 posts

<p>Ingeniero de Telecomunicación, apasionado de la Seguridad Informática. Le gusta estar al día en todo lo relacionado con Internet y las nuevas tecnologías.</p>

You might also like

Desarrollo 4 Comments

Cuándo dejar de ver el Mundo como un Ingeniero: quien esté libre de optimizar…

Confucio reunió a sus discípulos y les dijo: “Un optimista ve un vaso medio lleno. Un pesimista ve un vaso medio vacío. Un ingeniero ve un vaso demasiado grande“. Lo

Desarrollo 0 Comments

DeSymfonyDay 2014

Después de vivir otro intenso DeSymfony estas son mis primeras impresiones. Este año se ha celebrado en un sólo un día y con menos asistentes, volviendo de alguna manera  a

Android 3 Comments

¿El fin de WhatsApp?

Con el auge de los smartphones han surgido aplicaciones tales como WhatsApp, que sólo con conectarse a Internet (ya sea a través de wifi o red de datos de nuestro

Desarrollo

Framework: ¿Por qué es mejor usarlos?

Un Framework es un conjunto de librerías y conceptos preparados para ser utilizados en tus proyectos. Te olvidarás de muchos problemas tediosos, que otros programadores ya han solucionado. Soluciones que

Desarrollo 2 Comments

Qué es y cómo funciona Symfony2: Conceptos claves

Symfony2 es uno de los Framework más potentes que existen para desarrollar aplicaciones web. Punto. Pero, ¿cómo funciona? ¿Qué es realmente? Con este artículo, pretendo que te quede claro como

Desarrollo 1Comments

Maneja tu base de datos SQL con Python

Una de las principales herramientas en muchas empresas es el paquete Office de Microsoft. Este paquete aparte de incluir herramientas tan conocidas como Word o Excel, tienen un gestor de base

Desarrollo 7 Comments

Summernote, un potentísimo editor WYSIWYG en Bootstrap

Hoy traigo carne fresca y gratis. En muchos proyectos web surge la imperiosa necesidad de incluir un editor de texto enriquecido del tipo WYSIWYG, acrónimo de “What You See Is

Desarrollo 2 Comments

4 razones para usar GIT

Git es un sistema de control de versiones que está enfocado en la flexibilidad para los programadores y provee herramientas para gestión de equipos de desarrollo. En su sitio oficial

Android 0 Comments

Viajes Android

Hay veces en la que la tecnología me sorprende, sin hablar en plan futurista, sino en protocolos y comunicaciones que ya existen. En este caso una combinación Bluetooth, OBD-II y

8 Comments

  1. Marco
    julio 15, 18:24 Reply

    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.

  2. Toni
    julio 07, 20:35 Reply

    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.

  3. Pablo
    abril 27, 04:08 Reply

    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.

    • Rafa M.
      abril 29, 09:37 Reply

      Hola Pablo,

      Me alegro de que te haya sido de utilidad. Si has realizado alguna mejora, no dudes en compartirla con nosotros.
      Un abrazo

  4. ferran
    marzo 17, 19:19 Reply

    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

    • Rafa M.
      marzo 17, 20:01 Reply

      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

  5. Rafa M.
    julio 11, 14:21 Reply

    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!

  6. David
    julio 05, 22:15 Reply

    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

Leave a Reply