8.4 Comunicación FrontEnd-BackEnd mediante APIs (AJAX)
Verás cómo el frontend puede pedir datos al backend a través de una API, cómo se recibe esa información y cómo se muestra al usuario, usando un flujo real de ida y vuelta de datos.
Verás cómo el frontend puede pedir datos al backend a través de una API, cómo se recibe esa información y cómo se muestra al usuario, usando un flujo real de ida y vuelta de datos.
Los formularios HTML tradicionales envían los datos al servidor usando los atributos action y method, y provocan una recarga completa de la página. Con JavaScript y AJAX, podemos interceptar ese envío, capturar los datos y procesarlos de forma más flexible.
Formulario HTML tradicional (sin JS):
action="/ruta" y method="POST"
name
Formulario con JS y AJAX:
addEventListener("submit")
.value o FormData
fetch() AJAX (Asynchronous JavaScript And XML) es una técnica que permite enviar y recibir datos entre el navegador y el servidor sin recargar la página. Aunque el nombre menciona XML, hoy se usa mayormente con JSON, y se usa para:
Su flujo es:
AJAX es la base técnica de muchas aplicaciones interactivas modernas como chats, buscadores y gestores de tareas.
Una API transmite datos entre la interfaz del usuario y la lógica del servidor.
Ejemplo de flujo en un gestor de tareas:
GET /api/tareas) usando fetch.Este flujo de ida y vuelta es la base de la comunicación en apps modernas.
Cuando el backend recibe una solicitud desde el frontend mediante una API, debe responder en formato JSON con:
200 OK, 201 Created, 400 Bad Request, etc.)Ejemplo en Flask:
# Añade la importación de jsonifyfrom flask import jsonify, ...@app.route("/api/tareas")def api_tareas():tareas = Tarea.get_all()return jsonify([dict(row) for row in tareas])
¿Qué sucede aquí?
Tarea se convierte en un diccionarioAsegúrate de que los atributos del modelo sean serializables y evita incluir datos sensibles innecesarios.
El primer paso del flujo ocurre cuando el usuario interactúa con un formulario en la interfaz. En nuestro gestor de tareas, esto sucede al hacer clic en el botón para agregar una nueva tarea. Un evento de JavaScript captura esta acción:
document.querySelector("#form-tarea").addEventListener("submit", (e) => {e.preventDefault();const titulo = document.querySelector("#titulo").value;const categoria = categoriaSelector.getValue(true); // Devuelve stringenviarTarea({ title: titulo, category: categoria });});
Envío de datos al backend:
fetch("/api/tareas", {method: "POST",headers: { "Content-Type": "application/json" },body: JSON.stringify({title: "Estudiar Flask",category: "Estudio",status: "pendiente"})});
Cuando el backend recibe datos desde el frontend mediante fetch(), procesa igual que una forma nativa, con la diferencia en recepción de respuesta y respuesta en formato JSON.
Ejemplo
@app.route("/api/tareas", methods=["POST"])def crear_tarea():datos = request.get_json()categoria = Categoria.get_or_create(datos["category"])nueva = Tarea.create(datos["title"], "pendiente", categoria.id)return jsonify(dict(nueva)), 201
¿Qué hace esta función?
Tarea y la guarda en la base de datos201 Created
Además de crear tareas, una API permite modificar registros existentes. Para ello, el frontend puede enviar una solicitud PUT o PATCH usando fetch() con los nuevos datos que reemplazarán los existentes.
Ejemplo en JavaScript:
fetch("/api/tareas/3", {method: "PUT",headers: { "Content-Type": "application/json" },body: JSON.stringify({title: "Estudiar Flask avanzado",status: "completada"})});
Ejemplo en Flask (backend):
@app.route("/api/tareas/<int:id>", methods=["PUT"])def actualizar_tarea(id):datos = request.get_json()title = datos["title"]status = datos["status"]Tarea.update(id, title, status)return jsonify({"mensaje": "Tarea actualizada"}), 200
Una API también permite eliminar registros de forma remota. Desde el frontend, puedes hacer una solicitud DELETE mediante fetch() para borrar una tarea específica.
Ejemplo en JavaScript:
fetch("/api/tareas/3", {method: "DELETE"});
Ejemplo en Flask (backend):
@app.route("/api/tareas/<int:id>", methods=["DELETE"])def eliminar_tarea(id):Tarea.delete(id)return jsonify({"mensaje": "Tarea eliminada"}), 200
¿Qué ocurre en este flujo?
DELETE a la API con el ID correspondiente.Cuando algo falla en el intercambio entre frontend y backend, la API debe indicar qué ocurrió. El frontend también debe reaccionar apropiadamente.
En el backend (Flask), puedes usar códigos de estado:
return jsonify({"error": "Datos incompletos"}), 400
En el frontend (JavaScript), se puede capturar errores así:
fetch("/api/tareas").then(res => {if (!res.ok) throw new Error("Error en la API");return res.json();}).then(data => { console.log("Proceso completado") })
Un sistema robusto responde bien ante fallos esperados o inesperados, controlando errores y respondiend con códigos HTTP claros.
Conocer el flujo API-frontend-backend te permite crear apps funcionales y responsivas, conectando la interfaz del usuario con la lógica de servidor en una aplicación web.
Recursos útiles: