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!