Lección 11 de 20 · Lectura y práctica
Consumo de APIs REST con Fetch y Axios en React Native
Concepto claveEn el desarrollo de aplicaciones móviles con React Native y Expo, el consumo de APIs REST es fundamental para conectar tu app con servicios externos, como bases de datos, autenticación o contenido dinámico. Piensa.
Del concepto a la práctica
Taller de esta lección
Consumir una API implica comprobar dos capas: que la petición termine con un estado HTTP aceptable y que el cuerpo tenga la forma esperada. Con datos locales simulados puedes practicar el contrato sin inventar un servidor. Considera una respuesta con id, name y price.
Ejemplo resuelto
Ejecuta
fetchcontra una fuente autorizada o una función simulada.Comprueba
response.okantes de llamar aresponse.json().Valida que cada registro tenga precio numérico.
Convierte la respuesta a la forma que usa el catálogo. Un error frecuente es tratar cualquier respuesta como éxito porque
fetchresolvió la promesa. Corrígelo lanzando un error cuandooksea falso y mostrando el estado HTTP sin exponer datos sensibles.
Pruébalo
Procesa estos registros: p1, lápiz, 1.20 y p2, agenda, 6.50; rechaza uno sin precio.
Comprueba tu resultado
Debe aceptarse una lista de dos objetos válidos, conservar precios 1.20 y 6.50, y producir un error controlado para el registro incompleto.
Contrato local ejecutable y precio en centavos
El siguiente transporte sustituye una URL ficticia. fetch real requiere URL absoluta en móvil; localhost del teléfono no designa automáticamente el ordenador.
async function productos(pedir){
const r=await pedir();
if(!r.ok) throw new Error(`HTTP ${r.status}`);
const xs=await r.json();
if(!Array.isArray(xs)||xs.some(x=>typeof x.id!=='string'||!x.id||typeof x.name!=='string'||!x.name.trim()||!Number.isSafeInteger(x.priceCents)||x.priceCents<0)||new Set(xs.map(x=>x.id)).size!==xs.length) throw new Error('Esquema inválido');
return xs;
}
async function transporte(modo='ok'){
return {ok:modo!=='http',status:modo==='http'?404:200,json:async()=>modo==='schema'?[{id:'p3',name:'Sin precio'}]:[{id:'p1',name:'Lápiz',priceCents:120},{id:'p2',name:'Agenda',priceCents:650}]};
}productos(()=>transporte('ok')) resuelve dos registros,120/650centavos; http rechaza HTTP404 y schema rechaza Esquema inválido. No se llamó ningún proveedor. Axios normalmente rechaza status fuera de2xx, pero validateStatus puede configurar ese criterio; ambos clientes necesitan validar el cuerpo. JSON no crea automáticamente objetos de negocio válidos.
No incluyas tokens o claves privadas en EXPO_PUBLIC: sus valores se incorporan al bundle. Un endpoint público no requiere inventar un permiso nativo de red. Elige mensajes útiles que no vuelquen cuerpo, headers o credenciales en pantalla. Variables Expo.

Mapa de prácticaDistingue 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 conectar tu app con servicios externos, como bases de datos, autenticación o contenido dinámico. Piensa en una API como un camarero en un restaurante: tu app (el cliente) hace una solicitud (como pedir un plato), y la API (el camarero) trae la respuesta (la comida) desde la cocina (el servidor). Esto permite que tu app muestre datos actualizados sin necesidad de recargar manualmente, similar a cómo una app de clima obtiene información en tiempo real.
Para realizar estas solicitudes, usamos principalmente dos herramientas: Fetch (nativo de JavaScript) y Axios (una librería externa). Fetch viene incluido en React Native, lo que lo hace ligero y sin dependencias adicionales, ideal para proyectos simples. Axios, por otro lado, ofrece características avanzadas como interceptores y cancelación de solicitudes, siendo más robusto para aplicaciones complejas. Ambas permiten realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) mediante métodos HTTP como GET, POST, PUT y DELETE, esenciales para interactuar con servidores en el mundo real.
Cómo funciona en la práctica
Para consumir una API en React Native con Expo, sigue estos pasos: primero, identifica el endpoint de la API (la URL a la que enviarás solicitudes). Luego, elige entre Fetch o Axios según tus necesidades. Con Fetch, usas la función fetch() que devuelve una promesa; con Axios, instalas la librería y usas métodos como axios.get(). En ambos casos, manejas la respuesta asíncrona con async/await o .then(), y actualizas el estado de tu componente para reflejar los datos. Por ejemplo, al cargar una lista de productos desde una API, harías una solicitud GET al montar el componente, procesarías la respuesta JSON y la mostrarías en una lista.
Un flujo típico incluye: 1) Configurar la solicitud con headers (como Content-Type para JSON), 2) Enviar la solicitud con el método adecuado, 3) Manejar errores con try-catch o .catch(), y 4) Actualizar la UI. En Expo, asegúrate de que tu app tenga permisos de red si es necesario, aunque Fetch y Axios funcionan out-of-the-box en la mayoría de los casos. Para APIs que requieren autenticación, añade tokens en los headers, similar a mostrar una identificación al entrar a un lugar restringido.
Codigo en accion
Aquí tienes un ejemplo funcional usando Fetch para obtener datos de una API pública. Crea un componente en React Native y copia este código:
import React, { useState, useEffect } from 'react';
import { View, Text, FlatList, ActivityIndicator } from 'react-native';
export default function ProductList() {
const [products, setProducts] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
fetchProducts();
}, []);
const fetchProducts = async () => {
try {
const response = await fetch('https://fakestoreapi.com/products');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setProducts(data);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
if (loading) {
return ;
}
if (error) {
return Error: {error} ;
}
return (
item.id.toString()}
renderItem={({ item }) => (
{item.title}
{item.price}
)}
/>
);
} Ahora, refactorizamos el mismo ejemplo usando Axios para mostrar mejoras. Primero, instala Axios: npm install axios. Luego, modifica el código:
import React, { useState, useEffect } from 'react';
import { View, Text, FlatList, ActivityIndicator } from 'react-native';
import axios from 'axios';
export default function ProductListAxios() {
const [products, setProducts] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
fetchProducts();
}, []);
const fetchProducts = async () => {
try {
const response = await axios.get('https://fakestoreapi.com/products');
setProducts(response.data);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
if (loading) {
return ;
}
if (error) {
return Error: {error} ;
}
return (
item.id.toString()}
renderItem={({ item }) => (
{item.title}
{item.price}
)}
/>
);
} Nota cómo Axios simplifica el manejo de respuestas al parsear JSON automáticamente y proporcionar un objeto response.data, eliminando la necesidad de verificar response.ok y llamar a .json() manualmente.
Errores comunes
- No manejar estados de carga y error: Olvidar mostrar indicadores de carga o mensajes de error puede confundir a los usuarios. Siempre incluye estados para loading y error, como en los ejemplos anteriores.
- No verificar la respuesta de la API: Con Fetch, asumir que la respuesta siempre es exitosa sin chequear
response.okpuede llevar a errores silenciosos. Usa condicionales o maneja excepciones con try-catch. - No usar useEffect correctamente: Llamar fetch directamente en el cuerpo del componente causa bucles infinitos. Envuelve las solicitudes en
useEffectcon dependencias adecuadas para controlar cuándo se ejecutan. - Olvidar permisos de red en Expo: Para ciertas APIs o en modo desarrollo, puede necesitarse configurar permisos en
app.json. Revisa la documentación de Expo si encuentras problemas de conexión. - No optimizar solicitudes: Hacer múltiples llamadas API innecesarias puede ralentizar la app. Usa técnicas como debouncing o caching para mejorar el rendimiento.
Checklist de dominio
- Puedo realizar una solicitud GET a una API REST usando Fetch en React Native.
- Puedo realizar una solicitud GET a una API REST usando Axios en React Native.
- Sé manejar estados de carga, error y éxito al consumir una API.
- Puedo enviar datos a una API usando métodos POST o PUT con headers JSON.
- Comprendo cuándo usar Fetch vs. Axios basado en las necesidades del proyecto.
- Sé cómo debuggear problemas comunes de red en Expo, como errores de CORS o timeouts.
- Puedo integrar datos de API en componentes de UI como FlatList o ScrollView.
Crear una app de lista de tareas con API REST
En este ejercicio, desarrollarás una app de lista de tareas que consume una API REST para gestionar tareas. Sigue estos pasos:
- Configuración inicial: Crea un nuevo proyecto Expo usando
npx create-expo-app TaskApp. Instala Axios connpm install axios. - Diseña la interfaz: Crea un componente principal con:
- Un campo de texto para añadir nuevas tareas.
- Un botón para enviar la tarea a la API.
- Una lista para mostrar las tareas existentes.
- Botones para marcar tareas como completadas o eliminarlas.
- Integra la API: Usa la API pública JSONPlaceholder (
https://jsonplaceholder.typicode.com/todos). Implementa:- Función para obtener tareas (GET) al cargar la app.
- Función para añadir una tarea (POST) al enviar el formulario.
- Función para actualizar una tarea como completada (PUT).
- Función para eliminar una tarea (DELETE).
- Maneja estados: Añade estados de loading y error. Muestra un indicador de carga al hacer solicitudes y mensajes de error si fallan.
- Prueba la app: Ejecuta la app con
npx expo starty prueba todas las funcionalidades en un emulador o dispositivo real.
Entrega: Proporciona el código completo del componente principal y una captura de pantalla de la app funcionando.
Pistas
- Usa
useStatepara manejar la lista de tareas y el texto de entrada. - Recuerda que JSONPlaceholder es una API de prueba; los cambios no se persisten, pero simulan respuestas reales.
- Para el botón de eliminar, usa el ID de la tarea en la URL, ej:
axios.delete(`https://jsonplaceholder.typicode.com/todos/${id}`).
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con React Native con Expo: Desarrollo de Apps Nativas para iOS y Android
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.