5.3. Ejemplo con librería (Axios) – API REST
En este apartado vamos a ver cómo consumir una API REST utilizando una librería externa, en concreto Axios, que simplifica mucho la carga de datos y el manejo de errores. Trabajaremos con un endpoint real del portal de Datos Abiertos de la Junta de Castilla y León en formato JSON (por ejemplo, la agenda cultural expuesta como servicio REST).
📦 Cómo incluir la librería
Usaremos CDN para no complicar el entorno. Inserta Axios en tu HTML antes de tu script:
<script src="https://cdn.jsdelivr.net/npm/axios@1.7.7/dist/axios.min.js" crossorigin="anonymous"></script>
<script type="module" src="main.js"></script>
Más adelante, si empaquetas con Vite/Webpack, podrás hacer import axios from "axios" sin cambiar nada del resto del código.
📌 Flujo de trabajo con Axios
- Incluir Axios desde CDN.
- Llamar a la API con
axios.get(url). - Obtener los datos desde
response.data. - Comprobar la estructura de la respuesta (array u objeto con claves).
- Transformar los resultados a un formato manejable.
- Renderizar la información en una tabla o tarjetas HTML.
- Manejar errores de red o de API con mensajes claros.
🧩 Código paso a paso
1) Llamada a la API con Axios
const URL_API = "https://datosabiertos.jcyl.es/api/agenda-cultural";
// (ejemplo; sustituye por la ruta real de la API)
async function cargarAPI() {
try {
const { data } = await axios.get(URL_API, {
headers: { Accept: "application/json" },
timeout: 8000 // ms
});
return data;
} catch (err) {
if (axios.isAxiosError(err)) {
console.error("Axios error:", err.message, "status:", err.response?.status);
} else {
console.error("Error desconocido:", err);
}
throw err;
}
}
2) Detectar la estructura y quedarnos con la lista
En muchas APIs, la respuesta tiene esta forma:
{
"resultados": [
{ "titulo": "Concierto en Salamanca", "fecha": "2024-09-01", "lugar": "Plaza Mayor" },
{ "titulo": "Exposición en León", "fecha": "2024-09-05", "lugar": "Museo de Arte" }
]
}
Podemos acceder así:
function obtenerEventos(data) {
return data?.resultados ?? [];
}
3) Transformar cada registro a un modelo útil
function aFilasTabla(eventos) {
return eventos.map(ev => ({
titulo: ev.titulo ?? "",
fecha: ev.fecha ?? "",
lugar: ev.lugar ?? ""
}));
}
4) Renderizar en tabla HTML sencilla
function renderTabla(datos, columnas, destino = document.body) {
const tabla = document.createElement("table");
// cabecera
const thead = document.createElement("thead");
const trH = document.createElement("tr");
columnas.forEach(col => {
const th = document.createElement("th");
th.scope = "col";
th.textContent = col;
trH.appendChild(th);
});
thead.appendChild(trH);
tabla.appendChild(thead);
// filas
const tbody = document.createElement("tbody");
datos.forEach(fila => {
const tr = document.createElement("tr");
columnas.forEach(col => {
const td = document.createElement("td");
td.textContent = fila[col] ?? "";
tr.appendChild(td);
});
tbody.appendChild(tr);
});
tabla.appendChild(tbody);
destino.appendChild(tabla);
}
5) Ponerlo todo junto
(async () => {
const data = await cargarAPI();
const eventos = obtenerEventos(data);
const filas = aFilasTabla(eventos);
renderTabla(filas, ["titulo", "fecha", "lugar"]);
})();
⚖️ Comparación con el enfoque vanilla
| Aspecto | Vanilla (fetch) |
Con librería (Axios) |
|---|---|---|
| Parseo JSON | res.json() manual |
Automático en response.data |
| Manejo de errores | try/catch + comprobar res.ok |
axios.isAxiosError, códigos y mensajes claros |
| Timeouts | Debes usar AbortController |
Opción timeout integrada |
| Cancelación | AbortController |
Compatible con { signal } en Axios 1.x |
| Cabeceras | Hay que pasarlas manualmente (opcional) | Fácil añadir/gestionar globalmente |
| Código repetitivo | Más “pegamento” en cada endpoint | Configuración global y defaults |
| Dependencias | Ninguna | 1 librería ligera |
📝 Preguntas de repaso
Repaso
- ¿Qué diferencia hay entre
response.json()en vanilla yresponse.dataen Axios? - ¿Qué ventaja aporta el parámetro
timeouten una llamada a la API? - ¿Cómo accederías al array de resultados si el JSON de la API no viene bajo
resultados, sino bajo otra clave? - ¿Qué columnas hemos decidido mostrar en la tabla y por qué?
- ¿Qué beneficios prácticos aporta Axios frente a
fetchal trabajar con APIs REST?