En esta lección, aprenderemos cómo integrar APIs REST en una aplicación React Native. Las APIs REST son una forma común de interactuar con servicios web y obtener datos. Utilizaremos la biblioteca axios para realizar solicitudes HTTP y manejar las respuestas.
Objetivos de la Lección
- Comprender qué es una API REST.
- Configurar
axiospara realizar solicitudes HTTP. - Realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) con una API REST.
- Manejar respuestas y errores de la API.
¿Qué es una API REST?
Una API REST (Representational State Transfer) es un conjunto de reglas que permiten a los sistemas comunicarse entre sí a través de HTTP. Las APIs RESTful utilizan métodos HTTP estándar como GET, POST, PUT y DELETE para realizar operaciones CRUD.
Configuración de axios
Primero, necesitamos instalar axios en nuestro proyecto React Native. Puedes hacerlo ejecutando el siguiente comando en tu terminal:
Realizando Solicitudes HTTP con axios
Vamos a crear un ejemplo práctico donde realizaremos operaciones CRUD con una API REST ficticia.
- Configuración Inicial
Primero, configuramos axios en nuestro proyecto. Creamos un archivo api.js para centralizar la configuración de axios.
// api.js
import axios from 'axios';
const api = axios.create({
baseURL: 'https://jsonplaceholder.typicode.com', // URL base de la API
timeout: 1000, // Tiempo de espera de la solicitud
headers: { 'Content-Type': 'application/json' }
});
export default api;
- Realizando una Solicitud GET
Vamos a obtener una lista de usuarios desde la API.
// App.js
import React, { useEffect, useState } from 'react';
import { View, Text, FlatList, StyleSheet } from 'react-native';
import api from './api';
const App = () => {
const [users, setUsers] = useState([]);
useEffect(() => {
const fetchUsers = async () => {
try {
const response = await api.get('/users');
setUsers(response.data);
} catch (error) {
console.error('Error fetching users:', error);
}
};
fetchUsers();
}, []);
return (
<View style={styles.container}>
<Text style={styles.title}>Lista de Usuarios</Text>
<FlatList
data={users}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<View style={styles.user}>
<Text>{item.name}</Text>
<Text>{item.email}</Text>
</View>
)}
/>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 20,
},
title: {
fontSize: 24,
fontWeight: 'bold',
marginBottom: 20,
},
user: {
padding: 10,
borderBottomWidth: 1,
borderBottomColor: '#ccc',
},
});
export default App;
- Realizando una Solicitud POST
Vamos a crear un nuevo usuario en la API.
// App.js (continuación)
import { Button, TextInput } from 'react-native';
const App = () => {
const [users, setUsers] = useState([]);
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const addUser = async () => {
try {
const response = await api.post('/users', { name, email });
setUsers([...users, response.data]);
} catch (error) {
console.error('Error adding user:', error);
}
};
return (
<View style={styles.container}>
<Text style={styles.title}>Lista de Usuarios</Text>
<TextInput
style={styles.input}
placeholder="Nombre"
value={name}
onChangeText={setName}
/>
<TextInput
style={styles.input}
placeholder="Email"
value={email}
onChangeText={setEmail}
/>
<Button title="Agregar Usuario" onPress={addUser} />
<FlatList
data={users}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<View style={styles.user}>
<Text>{item.name}</Text>
<Text>{item.email}</Text>
</View>
)}
/>
</View>
);
};
const styles = StyleSheet.create({
// ... estilos anteriores
input: {
height: 40,
borderColor: 'gray',
borderWidth: 1,
marginBottom: 10,
padding: 10,
},
});
- Realizando una Solicitud PUT
Vamos a actualizar un usuario existente.
const updateUser = async (id, updatedName, updatedEmail) => {
try {
const response = await api.put(`/users/${id}`, { name: updatedName, email: updatedEmail });
setUsers(users.map(user => (user.id === id ? response.data : user)));
} catch (error) {
console.error('Error updating user:', error);
}
};
- Realizando una Solicitud DELETE
Vamos a eliminar un usuario.
const deleteUser = async (id) => {
try {
await api.delete(`/users/${id}`);
setUsers(users.filter(user => user.id !== id));
} catch (error) {
console.error('Error deleting user:', error);
}
};Ejercicio Práctico
- Objetivo: Crear una aplicación que permita listar, agregar, actualizar y eliminar usuarios utilizando una API REST.
- Instrucciones:
- Configura
axioscomo se muestra en la lección. - Implementa las funciones para realizar solicitudes GET, POST, PUT y DELETE.
- Crea una interfaz de usuario que permita interactuar con estas funciones.
- Configura
Solución del Ejercicio
// App.js (solución completa)
import React, { useEffect, useState } from 'react';
import { View, Text, FlatList, StyleSheet, TextInput, Button } from 'react-native';
import api from './api';
const App = () => {
const [users, setUsers] = useState([]);
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [editingUser, setEditingUser] = useState(null);
useEffect(() => {
const fetchUsers = async () => {
try {
const response = await api.get('/users');
setUsers(response.data);
} catch (error) {
console.error('Error fetching users:', error);
}
};
fetchUsers();
}, []);
const addUser = async () => {
try {
const response = await api.post('/users', { name, email });
setUsers([...users, response.data]);
setName('');
setEmail('');
} catch (error) {
console.error('Error adding user:', error);
}
};
const updateUser = async (id) => {
try {
const response = await api.put(`/users/${id}`, { name, email });
setUsers(users.map(user => (user.id === id ? response.data : user)));
setEditingUser(null);
setName('');
setEmail('');
} catch (error) {
console.error('Error updating user:', error);
}
};
const deleteUser = async (id) => {
try {
await api.delete(`/users/${id}`);
setUsers(users.filter(user => user.id !== id));
} catch (error) {
console.error('Error deleting user:', error);
}
};
const handleEdit = (user) => {
setEditingUser(user.id);
setName(user.name);
setEmail(user.email);
};
return (
<View style={styles.container}>
<Text style={styles.title}>Lista de Usuarios</Text>
<TextInput
style={styles.input}
placeholder="Nombre"
value={name}
onChangeText={setName}
/>
<TextInput
style={styles.input}
placeholder="Email"
value={email}
onChangeText={setEmail}
/>
<Button
title={editingUser ? "Actualizar Usuario" : "Agregar Usuario"}
onPress={editingUser ? () => updateUser(editingUser) : addUser}
/>
<FlatList
data={users}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<View style={styles.user}>
<Text>{item.name}</Text>
<Text>{item.email}</Text>
<Button title="Editar" onPress={() => handleEdit(item)} />
<Button title="Eliminar" onPress={() => deleteUser(item.id)} />
</View>
)}
/>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 20,
},
title: {
fontSize: 24,
fontWeight: 'bold',
marginBottom: 20,
},
user: {
padding: 10,
borderBottomWidth: 1,
borderBottomColor: '#ccc',
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
},
input: {
height: 40,
borderColor: 'gray',
borderWidth: 1,
marginBottom: 10,
padding: 10,
},
});
export default App;Conclusión
En esta lección, hemos aprendido cómo integrar APIs REST en una aplicación React Native utilizando axios. Hemos cubierto cómo realizar operaciones CRUD y manejar respuestas y errores de la API. Con estos conocimientos, puedes interactuar con cualquier API RESTful y construir aplicaciones más dinámicas y funcionales.
En la siguiente lección, exploraremos conceptos avanzados como la API de Contexto y los Hooks en React Native. ¡Sigue adelante!
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
