Consumir APIs en React: Guía Completa y Paso a Paso

En React, puedes consumir APIs de varias maneras, dependiendo de las necesidades y la complejidad de tu proyecto. Las principales formas son:

  Consumir de APIs

  • Fetch API (nativo de JavaScript): Una solución integrada en el navegador para realizar solicitudes HTTP.
  • Axios: Una librería externa muy popular que facilita el trabajo con solicitudes y ofrece funciones avanzadas como interceptores y manejo de respuestas.
  • React Query: Una herramienta avanzada para la gestión del estado de datos, sincronización, y caché, ideal para aplicaciones con múltiples fuentes de datos.
  • Hooks personalizados: Permiten encapsular la lógica de consumo de APIs en funciones reutilizables.

Esta guía incluye ejemplos prácticos para cada método, destacando su implementación, ventajas y consideraciones, para que puedas decidir cuál se adapta mejor a tu proyecto.

1. Método Fetch API Nativo


Implementación Básica

jsx
import { useState, useEffect } from 'react';

function FetchExample() {
  const [posts, setPosts] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchPosts = async () => {
      try {
        const response = await fetch('https://api.vercel.app/blog');
        if (!response.ok) {
          throw new Error('Error en la solicitud');
        }
        const data = await response.json();
        setPosts(data);
        setLoading(false);
      } catch (error) {
        setError(error.message);
        setLoading(false);
      }
    };

    fetchPosts();
  }, []);

  if (loading) return <div>Cargando...</div>;
  if (error) return <div>Error: {error}</div>;

  return (
    <div>
      {posts.map(post => (
        <div key={post.id}>
          <h2>{post.title}</h2>
          <p>{post.content}</p>
        </div>
      ))}
    </div>
  );
}
  Ventajas

  • Método nativo de JavaScript
  • No requiere instalación de librerías adicionales
  • Soporte en todos los navegadores modernos

  Desventajas

  • Manejo de errores menos intuitivo
  • Sin soporte nativo para cancelación de solicitudes
  • Configuración manual de headers y opciones

2. Axios - Consumo de API con Gestión Avanzada


Instalación

bash
npm install axios

Implementación

jsx
import { useState, useEffect } from 'react';
import axios from 'axios';

function AxiosExample() {
  const [posts, setPosts] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const source = axios.CancelToken.source();

    const fetchPosts = async () => {
      try {
        const response = await axios.get('https://api.vercel.app/blog', {
          cancelToken: source.token,
          headers: {
            'Content-Type': 'application/json'
          }
        });
        setPosts(response.data);
        setLoading(false);
      } catch (error) {
        if (axios.isCancel(error)) {
          console.log('Solicitud cancelada');
        } else {
          setError(error.message);
        }
        setLoading(false);
      }
    };

    fetchPosts();

    // Función de limpieza
    return () => {
      source.cancel('Componente desmontado');
    };
  }, []);

  if (loading) return <div>Cargando...</div>;
  if (error) return <div>Error: {error}</div>;

  return (
    <div>
      {posts.map(post => (
        <div key={post.id}>
          <h2>{post.title}</h2>
          <p>{post.content}</p>
        </div>
      ))}
    </div>
  );
}
  Ventajas

  • Interceptores de solicitudes
  • Cancelación de solicitudes
  • Transformación de datos
  • Manejo de errores más robusto

3. React Query - Gestión de Estado de Datos


Instalación

bash
npm install @tanstack/react-query

Implementación

jsx
import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query';

// Configuración del cliente de Query
const queryClient = new QueryClient();

// Función de fetching
const fetchPosts = async () => {
  const response = await fetch('https://api.vercel.app/blog');
  if (!response.ok) {
    throw new Error('Network response was not ok');
  }
  return response.json();
};

function PostsComponent() {
  const { 
    data: posts, 
    isLoading, 
    isError, 
    error 
  } = useQuery({
    queryKey: ['posts'],
    queryFn: fetchPosts,
    staleTime: 5000, // Caché por 5 segundos
    refetchOnWindowFocus: true
  });

  if (isLoading) return <div>Cargando...</div>;
  if (isError) return <div>Error: {error.message}</div>;

  return (
    <div>
      {posts.map(post => (
        <div key={post.id}>
          <h2>{post.title}</h2>
          <p>{post.content}</p>
        </div>
      ))}
    </div>
  );
}

// Envolver la aplicación con QueryClientProvider
function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <PostsComponent />
    </QueryClientProvider>
  );
}
  Ventajas

  • Gestión de caché automática
  • Refresco de datos en segundo plano
  • Manejo de estados de carga y error
  • Optimización de rendimiento

4. Hook Personalizado - Abstracción y Reutilización


jsx
import { useState, useEffect } from 'react';

function useApiData(url) {
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch(url);
        if (!response.ok) {
          throw new Error('Error en la solicitud');
        }
        const result = await response.json();
        setData(result);
        setLoading(false);
      } catch (error) {
        setError(error);
        setLoading(false);
      }
    };

    fetchData();
  }, [url]);

  return { data, loading, error };
}

function PostsComponent() {
  const { 
    data: posts, 
    loading, 
    error 
  } = useApiData('https://api.vercel.app/blog');

  if (loading) return <div>Cargando...</div>;
  if (error) return <div>Error: {error.message}</div>;

  return (
    <div>
      {posts.map(post => (
        <div key={post.id}>
          <h2>{post.title}</h2>
          <p>{post.content}</p>
        </div>
      ))}
    </div>
  );
}
  Ventajas

  • Lógica de fetching reutilizable
  • Separación de preocupaciones
  • Fácil mantenimiento
  • Flexibilidad para múltiples endpoints

  Conclusión

Cada método de consumo de API en React tiene sus propias ventajas:

  • Fetch: Simple y nativo
  • Axios: Potente y configurable
  • React Query: Gestión de estado avanzada
  • Custom Hook: Máxima flexibilidad y reutilización