10 - 馃摗 Fetching de datos desde APIs externas
Aprende c贸mo obtener datos desde APIs externas en tus proyectos Next.js, tanto del lado del cliente (CSR) como del servidor (SSR o SSG).
Veremos ejemplos pr谩cticos con fetch y useEffect.
馃實 ¿Qu茅 significa “fetching de datos”?
“Fetching de datos” se refiere a obtener informaci贸n desde una fuente externa, como una API REST o una base de datos. En Next.js podemos hacerlo en diferentes momentos:
- 馃敼 Durante el build — con
getStaticProps(SSG) - 馃敼 En cada petici贸n — con
getServerSideProps(SSR) - 馃敼 En el navegador — usando React y
useEffect(CSR)
馃摝 Ejemplo 1 — Fetch en el build con getStaticProps
Este m茅todo obtiene los datos durante el proceso de compilaci贸n, generando una p谩gina est谩tica optimizada y r谩pida.
// pages/productos.js
export async function getStaticProps() {
const res = await fetch('https://fakestoreapi.com/products?limit=3');
const productos = await res.json();
return { props: { productos } };
}
export default function Productos({ productos }) {
return (
<div className="p-4">
<h1 className="text-2xl font-bold mb-3">馃洅 Productos (SSG)</h1>
{productos.map(prod => (
<div key={prod.id} className="border-b pb-2 mb-2">
<h4>{prod.title}</h4>
<p>馃挷{prod.price}</p>
</div>
))}
</div>
);
}
馃З Resultado visual:
馃洅 Producto A — 馃挷19.99
馃洅 Producto B — 馃挷25.50
馃洅 Producto C — 馃挷32.00
Generado en el build con datos de una API externa.
⚙️ Ejemplo 2 — Fetch en el servidor con getServerSideProps
Este enfoque obtiene los datos en cada solicitud. Es 煤til cuando la informaci贸n cambia frecuentemente o depende de un usuario autenticado.
// pages/noticias.js
export async function getServerSideProps() {
const res = await fetch('https://newsapi.org/v2/top-headlines?country=us&apiKey=demo');
const data = await res.json();
return {
props: { noticias: data.articles.slice(0, 3) },
};
}
export default function Noticias({ noticias }) {
return (
<div className="p-4">
<h1 className="text-2xl font-bold mb-3">馃摪 脷ltimas noticias (SSR)</h1>
{noticias.map((n, i) => (
<article key={i} className="border-b pb-2 mb-2">
<h4>{n.title}</h4>
<p>{n.source.name}</p>
</article>
))}
</div>
);
}
馃З Resultado visual:
馃摪 T铆tulo de noticia 1 — Fuente: CNN
馃摪 T铆tulo de noticia 2 — Fuente: BBC
馃摪 T铆tulo de noticia 3 — Fuente: Reuters
Se actualiza cada vez que el usuario accede a la p谩gina.
馃 Ejemplo 3 — Fetch del lado del cliente (CSR)
Tambi茅n puedes obtener datos directamente desde el navegador usando React Hooks. Esto es 煤til para contenido interactivo o que depende de la acci贸n del usuario.
// pages/clientefetch.js
import { useState, useEffect } from 'react';
export default function ClienteFetch() {
const [usuarios, setUsuarios] = useState([]);
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(data => setUsuarios(data.slice(0, 3)));
}, []);
return (
<div className="p-4">
<h1 className="text-2xl font-bold mb-3">馃懃 Usuarios (CSR)</h1>
{usuarios.map(u => (
<p key={u.id}>{u.name}</p>
))}
</div>
);
}
馃З Resultado visual:
馃懃 Leanne Graham
馃懃 Ervin Howell
馃懃 Clementine Bauch
Cargado din谩micamente desde el navegador con useEffect().
馃搳 Comparativa de m茅todos de fetching
| M茅todo | Ejecuta en | Momento | Ventajas | Desventajas |
|---|---|---|---|---|
| getStaticProps | Servidor (build) | Durante el build | R谩pido y cacheado | No se actualiza hasta el rebuild |
| getServerSideProps | Servidor | En cada request | Datos siempre actualizados | M谩s lento, depende del servidor |
| useEffect (fetch) | Cliente | Despu茅s del render | Interactivo, ideal para apps SPA | No indexado por buscadores |
getStaticProps para el contenido principal y useEffect para datos que cambian en tiempo real.
0 Comentarios
Si desea contactar comigo, lo puede hacer atravez deste formulario gracias