En esta lección, aprenderemos cómo manejar errores de red en React Native. El manejo adecuado de errores es crucial para crear aplicaciones robustas y ofrecer una buena experiencia de usuario. Veremos cómo detectar y gestionar errores al realizar solicitudes HTTP utilizando fetch y axios.
Conceptos Clave
-
Errores de Red Comunes:
- Errores de Conexión: Ocurren cuando no se puede establecer una conexión con el servidor.
- Errores de Respuesta: Ocurren cuando el servidor responde con un código de estado HTTP que indica un error (por ejemplo, 404, 500).
- Errores de Tiempo de Espera: Ocurren cuando una solicitud tarda demasiado en completarse.
-
Manejo de Errores con
fetch:fetches una API nativa de JavaScript para realizar solicitudes HTTP. No lanza errores para respuestas HTTP no exitosas (como 404 o 500), por lo que debemos manejar estos casos manualmente.
-
Manejo de Errores con
axios:axioses una biblioteca popular para realizar solicitudes HTTP. A diferencia defetch,axioslanza errores para respuestas HTTP no exitosas, lo que facilita el manejo de errores.
Ejemplo Práctico con fetch
Código de Ejemplo
import React, { useState, useEffect } from 'react';
import { View, Text, Button, ActivityIndicator } from 'react-native';
const FetchExample = () => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetchData = async () => {
setLoading(true);
setError(null);
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
setData(result);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchData();
}, []);
if (loading) {
return <ActivityIndicator size="large" color="#0000ff" />;
}
if (error) {
return (
<View>
<Text>Error: {error}</Text>
<Button title="Retry" onPress={fetchData} />
</View>
);
}
return (
<View>
<Text>Data: {JSON.stringify(data)}</Text>
</View>
);
};
export default FetchExample;Explicación
-
Estado Inicial:
data: Almacena los datos obtenidos de la API.loading: Indica si la solicitud está en curso.error: Almacena cualquier error que ocurra durante la solicitud.
-
Función
fetchData:- Establece
loadingentrueyerrorennullal inicio. - Realiza la solicitud
fetchy verifica si la respuesta es exitosa. - Si la respuesta no es exitosa, lanza un error con el código de estado HTTP.
- Si la solicitud es exitosa, convierte la respuesta a JSON y actualiza el estado
data. - En caso de error, actualiza el estado
errorcon el mensaje de error. - Finalmente, establece
loadingenfalse.
- Establece
-
Renderizado Condicional:
- Muestra un indicador de carga mientras
loadingestrue. - Muestra un mensaje de error y un botón de reintento si
errorno esnull. - Muestra los datos obtenidos si
datano esnull.
- Muestra un indicador de carga mientras
Ejemplo Práctico con axios
Código de Ejemplo
import React, { useState, useEffect } from 'react';
import { View, Text, Button, ActivityIndicator } from 'react-native';
import axios from 'axios';
const AxiosExample = () => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetchData = async () => {
setLoading(true);
setError(null);
try {
const response = await axios.get('https://api.example.com/data');
setData(response.data);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchData();
}, []);
if (loading) {
return <ActivityIndicator size="large" color="#0000ff" />;
}
if (error) {
return (
<View>
<Text>Error: {error}</Text>
<Button title="Retry" onPress={fetchData} />
</View>
);
}
return (
<View>
<Text>Data: {JSON.stringify(data)}</Text>
</View>
);
};
export default AxiosExample;Explicación
-
Estado Inicial:
- Similar al ejemplo con
fetch.
- Similar al ejemplo con
-
Función
fetchData:- Similar al ejemplo con
fetch, pero utilizaaxiospara realizar la solicitud. axioslanza un error automáticamente si la respuesta HTTP no es exitosa, lo que simplifica el manejo de errores.
- Similar al ejemplo con
-
Renderizado Condicional:
- Similar al ejemplo con
fetch.
- Similar al ejemplo con
Ejercicio Práctico
Ejercicio
- Crea una nueva pantalla en tu aplicación React Native.
- Utiliza
fetchoaxiospara realizar una solicitud a una API pública de tu elección. - Implementa el manejo de errores para mostrar un mensaje de error y un botón de reintento si la solicitud falla.
- Muestra un indicador de carga mientras la solicitud está en curso.
- Muestra los datos obtenidos de la API si la solicitud es exitosa.
Solución
import React, { useState, useEffect } from 'react';
import { View, Text, Button, ActivityIndicator } from 'react-native';
import axios from 'axios';
const MyApiScreen = () => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetchData = async () => {
setLoading(true);
setError(null);
try {
const response = await axios.get('https://api.publicapis.org/entries');
setData(response.data);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchData();
}, []);
if (loading) {
return <ActivityIndicator size="large" color="#0000ff" />;
}
if (error) {
return (
<View>
<Text>Error: {error}</Text>
<Button title="Retry" onPress={fetchData} />
</View>
);
}
return (
<View>
<Text>Data: {JSON.stringify(data)}</Text>
</View>
);
};
export default MyApiScreen;Retroalimentación
-
Errores Comunes:
- No verificar si la respuesta HTTP es exitosa al usar
fetch. - No manejar errores de red adecuadamente, lo que puede llevar a una mala experiencia de usuario.
- No mostrar un indicador de carga mientras se realiza la solicitud.
- No verificar si la respuesta HTTP es exitosa al usar
-
Consejos:
- Siempre verifica el estado de la respuesta HTTP al usar
fetch. - Utiliza
axiospara simplificar el manejo de errores. - Proporciona retroalimentación visual al usuario mientras se realiza la solicitud (por ejemplo, un indicador de carga).
- Siempre verifica el estado de la respuesta HTTP al usar
Conclusión
En esta lección, hemos aprendido cómo manejar errores de red en React Native utilizando fetch y axios. El manejo adecuado de errores es esencial para crear aplicaciones robustas y ofrecer una buena experiencia de usuario. En la próxima lección, exploraremos cómo utilizar AsyncStorage para almacenar datos localmente en la aplicación.
Curso de React Native
Módulo 1: Introducción a React Native
- ¿Qué es React Native?
- Configuración del Entorno de Desarrollo
- Aplicación Hola Mundo
- Entendiendo JSX
- Componentes y Props
Módulo 2: Componentes Básicos y Estilizado
- Visión General de Componentes Básicos
- Texto, Vista e Imagen
- Estilizado con Flexbox
- Manejo de Entrada del Usuario
- ScrollView y ListView
Módulo 3: Estado y Ciclo de Vida
- Métodos de Estado y Ciclo de Vida
- Manejo de Eventos
- Renderizado Condicional
- Listas y Claves
- Formularios y Componentes Controlados
Módulo 4: Navegación
- Introducción a React Navigation
- Navegador de Pila
- Navegador de Pestañas
- Navegador de Cajón
- Pasando Parámetros a Rutas
Módulo 5: Redes y Datos
- Obteniendo Datos con Fetch API
- Usando Axios para Solicitudes HTTP
- Manejo de Errores de Red
- AsyncStorage para Datos Locales
- Integración con APIs REST
Módulo 6: Conceptos Avanzados
Módulo 7: Despliegue y Publicación
- Construyendo para iOS
- Construyendo para Android
- Publicando en App Store
- Publicando en Google Play
- Integración y Entrega Continua
