Si te estás lanzando al mundo del desarrollo móvil, te habrás dado cuenta de que una aplicación que no se conecta a la red es, básicamente, un catálogo estático. Para que una app tenga contenido dinámico y se sienta viva, necesita comunicarse con un servidor externo. Aquí es donde entran en juego las API REST, que actúan como ese puente imprescindible entre la base de datos donde reside la información y la pantalla del usuario.
En este sentido, Retrofit se ha convertido en la herramienta estrella para los desarrolladores de Android. No es solo que sea eficiente, sino que nos quita de encima el trabajo sucio de gestionar peticiones HTTP a mano, permitiéndonos centrarnos en lo que realmente importa: la lógica de negocio y la experiencia del usuario. Vamos a desgranar a fondo cómo montar este sistema desde cero, sin dejar ni un solo detalle en el camino.
Conceptos Fundamentales: API REST y Formato JSON
Antes de tirar código, conviene tener claro qué estamos haciendo. Una API REST es básicamente un servicio que nos expone funciones para obtener o manipular datos. Imagina que es un camarero: tú le pides algo (una petición) y él te lo trae de la cocina (el servidor). Dependiendo de lo que queramos hacer, usaremos diferentes verbos HTTP: GET para recuperar datos, POST para enviar información nueva, PUT para actualizar registros existentes y DELETE para borrar contenido.
La gran mayoría de estas respuestas vienen en formato JSON (JavaScript Object Notation). Es un estándar basado en texto muy sencillo de leer, organizado en pares de clave-valor. Para que nuestra aplicación no vea el JSON como un simple texto largo, necesitamos un deserializador como GSON, que se encarga de mapear ese texto directamente en objetos de Java o Kotlin, ahorrándonos horas de parseo manual.
Preparando el Terreno: Dependencias y Permisos
Para que Retrofit funcione, primero debemos darle las herramientas necesarias en el archivo build.gradle (a nivel de módulo). Dependiendo de la versión de Android Studio, usaremos implementation para añadir la librería principal de Retrofit y el convertidor de GSON. También es muy recomendable añadir el logging-interceptor de OkHttp, que es la mano derecha del desarrollador para debuggear y ver exactamente qué está enviando y recibiendo la app en la consola.
Un error clásico que suele dar dolores de cabeza es el de la comunicación en texto plano. Si intentas conectar con una URL que usa HTTP en lugar de HTTPS, Android bloqueará la conexión por seguridad. Para solucionar esto en entornos de desarrollo, debemos añadir la propiedad android:usesCleartextTraffic=»true» dentro de la etiqueta application del AndroidManifest.xml. Además, no olvides que sin el permiso android.permission.INTERNET, tu app estará totalmente aislada del mundo.
Arquitectura de Conexión: Servicio y Adaptador
Para no dejar el código hecho un desastre, lo ideal es separar las responsabilidades. Primero creamos el ApiService, que es una interfaz donde definimos los endpoints o rutas de la API. Usando anotaciones como @GET o @POST, le decimos a Retrofit exactamente a qué URL debe ir y qué tipo de respuesta esperamos, envolviendo siempre el resultado en un objeto Call o usando funciones suspend para corrutinas.
Luego necesitamos el ApiAdapter o un cliente Singleton. El patrón Singleton es fundamental aquí porque no tiene sentido crear múltiples instancias de Retrofit; una sola conexión es suficiente para toda la aplicación. En esta clase configuramos la URL base (la raíz del servidor) y le indicamos que use GSON para convertir los datos. Si necesitas pasar parámetros dinámicos en la URL, puedes usar @Path o @Query dentro de la interfaz de servicio.
Modelado de Datos y Gestión de Estados
Para recibir la información, creamos data classes que reflejen exactamente la estructura del JSON. Un truco muy útil es usar el atributo @SerializedName; esto permite que, aunque el JSON tenga un nombre de campo extraño, en nuestro código de conceptos esenciales de Kotlin podamos usar nombres más claros y siguiendo las convenciones del lenguaje.
En aplicaciones modernas, especialmente con Jetpack Compose, es vital gestionar los estados de la interfaz. Aquí es donde brillan las Sealed Classes. En lugar de usar simples booleanos, creamos una clase sellada que puede ser Loading (está cargando), Success (todo salió bien) o Error (algo falló). Esto obliga al desarrollador a manejar todos los casos posibles mediante un when, evitando que la app se cierre inesperadamente si la conexión falla.
Implementación Práctica y Visualización
Cuando llega el momento de ejecutar la petición, debemos recordar que las llamadas de red nunca deben hacerse en el hilo principal, ya que bloquearían la interfaz y el sistema lanzaría un error de ANR (Application Not Responding). Para solucionar esto, utilizamos la gestión de hilos con Kotlin Coroutines con scope.launch o herramientas como doAsync, asegurándonos de volver al hilo de la UI solo para mostrar los resultados.
Para la parte visual, si usamos un RecyclerView tradicional, necesitaremos un Adapter y un ViewHolder. Si optamos por Jetpack Compose, podemos usar estados reactivos con mutableStateOf. Para rematar la experiencia, el uso de librerías como Picasso o Coil es imprescindible, ya que permiten cargar imágenes desde una URL de forma asíncrona y eficiente, gestionando el caché automáticamente para que la app vuele. Comparte esta información para que más personas conozcan del tema.