Capítulo 6.1: Conectando FastAPI con el frontend
Tiempo de estudio: 30 minutos
1. Volviendo al "hiperpropulsor": Comparación de protocolos
En el capítulo anterior, acoplamos nuestro Centro de Control de Misiones (frontend) a la "ISS" (API de Laravel). Ahora, volveremos a nuestro caza supersónico (FastAPI) y realizaremos la misma operación.
El objetivo de este capítulo no es simplemente repetir acciones, sino comparar dos enfoques. Es como si la misma nave Dragon se acoplara primero a la ISS y luego a la estación espacial china "Tiangong". El puerto de acoplamiento es el mismo (REST), pero puede haber matices en los procedimientos y la ubicación de los puertos.
💡 Analogía espacial:
El proceso es el mismo: acercarse, alinearse, acoplarse. Pero para la "ISS" tuvimos que usar el puerto
/api/planets
, y para "Tiangong", el puerto/spaceships
. Nuestro operador en el Centro de Control de Misiones debe conocer estos detalles para que la misión tenga éxito.
2. Preparando el "caza" (FastAPI) para el acoplamiento
Ya lo hicimos en el Capítulo 4.2, pero asegurémonos de que todo esté en su lugar.
Paso 1: Iniciando el servidor FastAPI
- Detenga el servidor Laravel si está en ejecución (para evitar conflictos de puertos).
- Abra una terminal en la carpeta de su proyecto FastAPI.
-
Active el entorno virtual:
- Windows:
.\venv\Scripts\Activate.ps1
- macOS / Linux:
source venv/bin/activate
- Windows:
-
Inicie el servidor:
El servidor estará disponible en la direcciónhttp://127.0.0.1:8000
.
Paso 2: Verificando la configuración CORS en main.py
Asegúrese de que su proyecto FastAPI tenga configurado el CORSMiddleware
que agregamos anteriormente. Debe permitir solicitudes desde la dirección de su frontend.
# main.py
from fastapi.middleware.cors import CORSMiddleware
# ...
origins = [
"http://127.0.0.1:5500", # Dirección de Live Server
"null", # Para file:///
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# ...
3. Reconfigurando la "antena" del Centro de Control de Misiones de vuelta a FastAPI
Ahora lo más interesante: los cambios mínimos que debemos hacer en nuestro JavaScript para que funcione de nuevo con FastAPI.
Paso 1: Cambiando la URL base
Abra api.js
y restaure API_BASE_URL
a su valor original.
// api.js
// Especificamos la URL de nuestra API FastAPI
const API_BASE_URL = 'http://127.0.0.1:8000'; // <-- ¡Sin /api!
// ... el resto del código de apiRequest ...
Paso 2: Adaptación a la estructura de respuesta de FastAPI
Recordemos que nuestro GET /spaceships
en FastAPI devuelve un array simple, no un objeto con paginación. Esto significa que necesitamos restaurar el código de fetchAndDisplayFleet
a su forma original.
Modifique la función fetchAndDisplayFleet
en app.js
:
// app.js
async function fetchAndDisplayFleet() {
try {
fleetListContainer.innerHTML = '<p>Cargando telemetría de FastAPI...</p>';
const ships = await apiRequest('/spaceships'); // <-- Solicitud a /spaceships
// En FastAPI tenemos un array simple, ¡así que la clave .data no es necesaria!
fleetListContainer.innerHTML = '';
if (ships.length === 0) {
fleetListContainer.innerHTML = '<p>No hay naves en el registro.</p>';
return;
}
ships.forEach(ship => {
// Restauramos nuestra función original para crear tarjetas
const card = createShipCard(ship);
fleetListContainer.appendChild(card);
});
} catch (error) {
fleetListContainer.innerHTML = `<p style="color: #ff6b6b;">Error al cargar la flota: ${error.message}</p>`;
}
}
// Función original para crear tarjetas de naves
function createShipCard(ship) {
const card = document.createElement('div');
card.className = 'card';
card.innerHTML = `
<h3>${ship.name} (ID: ${ship.id})</h3>
<p>Tipo: ${ship.type}</p>
<p>Año de lanzamiento: ${ship.launch_year}</p>
<p>Estado: ${ship.status}</p>
<div class="card-actions">
<button class="edit-btn" data-ship-id="${ship.id}">Editar</button>
<button class="delete-btn" data-ship-id="${ship.id}">Dar de baja</button>
</div>
`;
return card;
}
Paso 3: Verificando las operaciones CRUD
Dado que nuestros modelos Pydantic en FastAPI y los campos del formulario HTML coinciden (name
, type
, launch_year
, status
), las funciones handleSaveShip
y handleDeleteShip
deberían funcionar sin cambios, ya que ya apuntan al endpoint /spaceships
.
4. Conclusiones de la comparación: ¿Qué significa esto para un desarrollador frontend?
- Universalidad de REST: Ha comprobado visualmente que para el frontend no importa en qué esté escrito el backend (PHP/Laravel o Python/FastAPI), siempre que siga los principios de REST.
- Importancia de la documentación: Las principales diferencias radicaron en las URLs de los endpoints y la estructura de las respuestas JSON. Esto es precisamente lo que debe describirse en la documentación de la API. Sin ella, el desarrollador frontend trabajaría "a ciegas".
- Flexibilidad del frontend: Su código JavaScript debe ser lo suficientemente flexible para adaptarse fácilmente a diferentes formatos de datos (por ejemplo, verificar si hay una clave
data
, o si es simplemente un array).
Conclusión: La habilidad de trabajar con una API REST es una clave universal que abre las puertas a la interacción con cualquier backend moderno.
Cuestionario de repaso
🚀 Resumen del capítulo:
Has cambiado con éxito los "protocolos de comunicación" de tu Centro de Control de Misión y has comparado en la práctica el trabajo con dos sistemas de backend diferentes.
- ✅ Has consolidado la habilidad de configurar
API_BASE_URL
para cambiar entre servidores. - ✅ Has comprendido la importancia de la estructura de la respuesta (
data
vs un array simple) y cómo adaptar el frontend a ella. - ✅ Te has dado cuenta de que un buen desarrollador frontend debe estar preparado para trabajar con cualquier API RESTful, estudiando cuidadosamente su documentación.
¡Habilidad de acoplamiento universal adquirida! Ahora que sabemos configurar la conexión básica, es hora de hablar de protocolos más complejos: CORS, autenticación y seguridad.
📌 Verificación:
- Asegúrate de que tu servidor FastAPI está en ejecución.
- Asegúrate de que has restaurado
API_BASE_URL
y la lógica de manejo de respuestas enapp.js
a la variante para FastAPI.- Verifica que tu frontend realiza de nuevo correctamente todas las operaciones CRUD con el backend de FastAPI.
⚠️ Si hay errores:
- CORS error: Asegúrate de que el servidor FastAPI está en ejecución con la configuración CORS correcta.
- Error
Cannot read properties of undefined (reading 'length')
: Es posible que hayas olvidado eliminar la referencia a.data
deresponseData
.- 404 Not Found: Comprueba
API_BASE_URL
— FastAPI no tiene el prefijo/api
.