Saltar al contenido

Lección 11 de 20 · Lectura y práctica

Consumo de APIs REST con fetch y axios

Concepto claveEn el desarrollo de aplicaciones móviles con React Native y Expo, el consumo de APIs REST es fundamental para crear apps que interactúen con servicios externos. Imagina tu app como un restaurante: las APIs son los.

Del concepto a la práctica

Taller de esta lección

Una petición REST tiene fases separables: iniciar, recibir respuesta, verificar éxito, convertir datos y tratar errores. fetch no rechaza automáticamente una respuesta HTTP 404; debes comprobar response.ok. La decisión de usar fetch o axios importa menos que mantener este contrato y cancelar o ignorar resultados cuando el componente ya no debe actualizarlos.

Ejemplo resuelto

La implementación autónoma de abajo verifica HTTP y esquema mediante un transporte de prueba inyectado. Para una respuesta 200 con dos registros, el estado recibe esos dos; para 404, recibe error y no una lista falsa.

Pruébalo

  1. Marca carga antes de pedir.

  2. Verifica ok.

  3. Convierte JSON solo tras el éxito.

  4. Finaliza carga en éxito y error.

Error frecuente: capturar únicamente fallos de red. Corrige tratando también códigos HTTP no exitosos.

Ejercicio: simula 200 con [{id:'p1'},{id:'p2'}] y 404.

Comprueba tu resultado

longitud 2 en éxito y mensaje de error en 404.

Transporte local completo y esquema

El siguiente reemplaza la URL relativa: en móvil una API real necesita una URL absoluta configurada. El fixture inyecta un transporte y no realiza llamadas.

javascript
async function cargarProductos(pedir){
  const respuesta=await pedir();
  if(!respuesta.ok) throw new Error(`HTTP ${respuesta.status}`);
  const productos=await respuesta.json();
  if(!Array.isArray(productos)||productos.some(p=>!p||typeof p.id!=='string'||!p.id.trim()))
    throw new Error('Esquema inválido');
  if(new Set(productos.map(p=>p.id)).size!==productos.length) throw new Error('IDs duplicados');
  return productos;
}
function transportePrueba(status=200){
  return async()=>({ok:status>=200&&status<300,status,json:async()=>[{id:'p1'},{id:'p2'}]});
}

await cargarProductos(transportePrueba(200)) devuelve dos IDs;404 lanza HTTP404 antes de convertir JSON. Una respuesta200 con objeto o IDs repetidos falla esquema. Gestiona loading con finally y cancela o ignora respuestas viejas/desmontadas. localhost en un teléfono no es automáticamente tu Mac. Variables EXPO_PUBLIC se incorporan al código cliente y no son secretos. Axios moderno acepta signal de AbortController; CancelToken está deprecado. La cancelación y un error HTTP son caminos distintos, y ambos conservan un estado coherente. Axios, Variables Expo.

Estados de carga, éxito, vacío y error ofrecen salida mediante reintento.
CursaloMapa de práctica
Una petición tiene varios estados

Distingue carga, éxito con datos, respuesta vacía y error. Conserva una salida clara mediante reintento y evita mostrar una respuesta antigua como si correspondiera a la consulta vigente.

Ver la infografía en tamaño completo ↗

Concepto clave

En el desarrollo de aplicaciones móviles con React Native y Expo, el consumo de APIs REST es fundamental para crear apps que interactúen con servicios externos. Imagina tu app como un restaurante: las APIs son los proveedores que traen los ingredientes (datos) desde diferentes lugares, y tu código es el chef que los prepara para mostrar platos (interfaces) atractivos a los clientes (usuarios).

Dos herramientas principales para esta tarea son fetch (nativa de JavaScript) y axios (biblioteca externa). Fetch viene incluido en React Native, mientras que axios requiere instalación pero ofrece ventajas como interceptores y cancelación de peticiones. Ambas permiten realizar operaciones HTTP como GET, POST, PUT y DELETE, esenciales para CRUD (Crear, Leer, Actualizar, Eliminar) en aplicaciones reales.

Cómo funciona en la práctica

Para consumir una API, primero necesitas entender su estructura: endpoints, métodos HTTP, y formatos de datos (generalmente JSON). En React Native con Expo, debes considerar la asincronía, manejando promesas con async/await para evitar bloquear la interfaz de usuario. Un flujo típico incluye: 1) Configurar la petición, 2) Enviarla, 3) Procesar la respuesta, y 4) Manejar errores.

Por ejemplo, al obtener datos de usuarios desde una API, usarías un método GET. Con fetch, esto implica llamar a fetch() con la URL, mientras que con axios usarías axios.get(). Ambas devuelven promesas que puedes manejar con .then() o async/await. Es crucial agregar manejo de errores con try-catch para fallos de red o respuestas no válidas.

Código en acción

Aquí un ejemplo básico con fetch para obtener datos de una API pública:

// Ejemplo con fetch
const fetchData = async () => {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/posts');
    if (!response.ok) {
      throw new Error('Error en la red: ' + response.status);
    }
    const data = await response.json();
    console.log('Datos obtenidos:', data);
    return data;
  } catch (error) {
    console.error('Error al obtener datos:', error);
    return null;
  }
};

Refactorización con axios para mejor manejo:

// Instalación: npm install axios
import axios from 'axios';

const fetchDataWithAxios = async () => {
  try {
    const response = await axios.get('https://jsonplaceholder.typicode.com/posts');
    console.log('Datos obtenidos con axios:', response.data);
    return response.data;
  } catch (error) {
    console.error('Error con axios:', error.response ? error.response.data : error.message);
    return null;
  }
};

Errores comunes

  • No manejar estados de carga y error: Olvidar mostrar spinners o mensajes de error puede confundir a los usuarios. Siempre implementa estados como loading y error en tu componente.
  • Ignorar la asincronía: Usar .then() sin async/await puede llevar a código difícil de leer. Prefiere async/await para claridad.
  • Falta de validación de respuestas: Asumir que la API siempre devuelve datos válidos. Verifica response.ok en fetch o status en axios antes de procesar.
  • No cancelar peticiones en desmontaje: En React Native, si un componente se desmonta antes de completar una petición, puede causar memory leaks. Usa AbortController con fetch o cancel tokens con axios.
  • Exponer claves API en el código (solo para desarrollo): En producción, usa variables de entorno con Expo Constants o servicios seguros.

Checklist de dominio

  1. Puedo realizar peticiones GET, POST, PUT y DELETE usando fetch y axios.
  2. Sé manejar respuestas asíncronas con async/await y try-catch.
  3. Implemento estados de carga y error en la interfaz de usuario.
  4. Valido respuestas de API y manejo códigos de estado HTTP comunes (200, 404, 500).
  5. Uso AbortController o cancel tokens para evitar memory leaks.
  6. Configuro headers como Content-Type: application/json para peticiones POST/PUT.
  7. Integro el consumo de API en componentes React Native con useEffect y useState.

Crear una app de lista de tareas con API REST

En este ejercicio, construirás una app simple de lista de tareas que consume una API REST simulada. Sigue estos pasos:

  1. Crea un nuevo proyecto Expo: expo init TaskApp y elige una plantilla básica.
  2. Instala axios: npm install axios.
  3. Usa la API JSONPlaceholder (https://jsonplaceholder.typicode.com/todos) para obtener tareas.
  4. Implementa un componente que muestre las tareas en una FlatList, con un indicador de carga.
  5. Añade funcionalidad para marcar tareas como completadas (simulado con un PUT a la API).
  6. Maneja errores mostrando un mensaje si falla la petición.
  7. Prueba la app en un emulador o dispositivo físico.
Pistas
  • Usa useState para almacenar las tareas y el estado de carga.
  • Implementa useEffect para hacer la petición al montar el componente.
  • Para simular el PUT, puedes usar axios.put con un ID de tarea y actualizar el estado local.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Sigue con React Native y Expo: Interfaces, Estado y APIs de Dispositivo

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.