Consumo de API REST en mobile: latencia, errores y robustez

Implementa consumo de API con arquitectura mantenible, manejo de errores por capa y control de latencia para apps móviles reales.

Consumir una API en mobile no es solo hacer GET: debes controlar latencia, reintentos, cancelaciones y estados intermedios de UI.

Una capa de datos bien definida evita que cada pantalla implemente su propia lógica de red y multiplique bugs.

HTTP 200 no garantiza UX correcta: necesitas mapear errores técnicos a mensajes accionables para usuario y para soporte.

Si no modelas timeouts y conectividad deficiente, la app falla justo en el contexto más habitual del móvil: red inestable.

  • Tu UI no debería depender del JSON crudo del backend.
  • Define DTOs de red y conviértelos a modelos de dominio para desacoplar cambios de backend de la capa de presentación.
  • Versiona endpoints y campos críticos para evitar roturas silenciosas tras despliegues parciales.
  • Centraliza validaciones mínimas (nulos, tipos, defaults) antes de que los datos lleguen al estado de pantalla.
  • DTO para transporte; modelo para negocio.

Contratos de API y modelos de dominio

Tu UI no debería depender del JSON crudo del backend.

Define DTOs de red y conviértelos a modelos de dominio para desacoplar cambios de backend de la capa de presentación.

Versiona endpoints y campos críticos para evitar roturas silenciosas tras despliegues parciales.

Centraliza validaciones mínimas (nulos, tipos, defaults) antes de que los datos lleguen al estado de pantalla.

  • DTO para transporte; modelo para negocio.
  • Transformaciones en repositorio, no en componentes.
  • Contratos explícitos reducen regresiones.

Errores, timeouts y estrategia de reintento

Un buen cliente de API diferencia fallo temporal de fallo definitivo.

Separa errores de transporte (sin red, timeout), errores HTTP (401, 404, 500) y errores de parsing para reaccionar distinto.

Aplica reintentos solo en errores recuperables y con backoff; reintentar un 401 sin refrescar token solo empeora el problema.

Propaga metadatos útiles (status, código interno, requestId) para observabilidad y debugging posterior.

Integración con estado de UI

La red no vive aislada: impacta directamente en loaders, vacíos y errores de pantalla.

Conecta el resultado de API a un estado discriminado (`idle`, `loading`, `success`, `error`) para rendering predecible.

Evita disparar peticiones duplicadas desde múltiples efectos o hooks sin coordinación.

Diseña fallback UX: vista vacía útil, botón de reintento y trazabilidad de error para soporte.

Desarrollo de Apps
09

Consumo de API REST en mobile: latencia, errores y robustez

Implementa consumo de API con arquitectura mantenible, manejo de errores por capa y control de latencia para apps móviles reales.

Código del tema: Flujo movil de extremo a extremo

📘 Teoría

Contratos de API y modelos de dominio

Tu UI no debería depender del JSON crudo del backend.

Define DTOs de red y conviértelos a modelos de dominio para desacoplar cambios de backend de la capa de presentación.

Versiona endpoints y campos críticos para evitar roturas silenciosas tras despliegues parciales.

Centraliza validaciones mínimas (nulos, tipos, defaults) antes de que los datos lleguen al estado de pantalla.

  • DTO para transporte; modelo para negocio.
  • Transformaciones en repositorio, no en componentes.
  • Contratos explícitos reducen regresiones.

Errores, timeouts y estrategia de reintento

Un buen cliente de API diferencia fallo temporal de fallo definitivo.

1

Separa errores de transporte (sin red, timeout), errores HTTP (401, 404, 500) y errores de parsing para reaccionar distinto.

2

Aplica reintentos solo en errores recuperables y con backoff; reintentar un 401 sin refrescar token solo empeora el problema.

3

Propaga metadatos útiles (status, código interno, requestId) para observabilidad y debugging posterior.

Cliente HTTP con mapeo básico de errores
type ApiResult<T> = { ok: true; data: T } | { ok: false; kind: 'network' | 'http' | 'parse'; status?: number; message: string };

async function getFeed(): Promise<ApiResult<string[]>> {
  try {
    const response = await fetch('https://api.example.com/v1/feed', { method: 'GET' });
    if (!response.ok) {
      return { ok: false, kind: 'http', status: response.status, message: 'HTTP error' };
    }
    const json = await response.json();
    if (!Array.isArray(json.items)) {
      return { ok: false, kind: 'parse', message: 'Payload inválido' };
    }
    return { ok: true, data: json.items };
  } catch (error) {
    return { ok: false, kind: 'network', message: 'Sin conexión o timeout' };
  }
}

Integración con estado de UI

La red no vive aislada: impacta directamente en loaders, vacíos y errores de pantalla.

1

Conecta el resultado de API a un estado discriminado (`idle`, `loading`, `success`, `error`) para rendering predecible.

2

Evita disparar peticiones duplicadas desde múltiples efectos o hooks sin coordinación.

3

Diseña fallback UX: vista vacía útil, botón de reintento y trazabilidad de error para soporte.

🧪 Aprende probando

Ejemplo Ejemplo guiado Modela la respuesta de un endpoint de perfil y transforma DTO en modelo de dominio usado por la UI.

🏁 Retos

Reto Reto práctico Implementa una función `loadProducts` que devuelva éxito o error tipado, diferenciando red y HTTP.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .