¡Bienvenido al emocionante mundo de FastAPI y WebSockets! Hoy, vamos a sumergirnos profundamente en la mecánica de WebSockets usando FastAPI. Tanto si eres un desarrollador experimentado como si estás empezando, esta guía te guiará a través de los conceptos esenciales y las implementaciones prácticas de WebSockets. Pero antes de empezar, no olvidemos una herramienta útil que facilitará el desarrollo de tu API: Apidog. Puedes descargar Apidog gratis y optimizar las pruebas y la documentación de tu API sin esfuerzo.
¿Qué es FastAPI?
FastAPI es un framework web moderno y rápido (de alto rendimiento) para construir APIs con Python 3.7+ basado en sugerencias de tipo Python estándar. Te permite crear rápidamente APIs web que son robustas y de alto rendimiento. Una de las características destacadas de FastAPI es su capacidad para manejar la programación asíncrona y WebSockets con facilidad.
¿Qué son WebSockets?
WebSockets son un protocolo de comunicación que proporciona canales de comunicación full-duplex a través de una única conexión TCP. A diferencia de HTTP, que es un protocolo de solicitud-respuesta, WebSockets permite la comunicación bidireccional entre el cliente y el servidor. Esto los hace perfectos para aplicaciones en tiempo real como aplicaciones de chat, notificaciones en vivo y juegos.

¿Por qué usar FastAPI con WebSockets?
El diseño de FastAPI facilita la creación de APIs que admiten WebSockets. Con FastAPI, puedes construir APIs que no solo son rápidas y fiables, sino que también admiten la comunicación asíncrona mediante WebSockets. Esta combinación es perfecta para desarrollar aplicaciones modernas en tiempo real.
Empezando con FastAPI WebSockets
Para empezar, necesitarás instalar FastAPI y Uvicorn, que es un servidor ASGI para servir tus aplicaciones FastAPI.
pip install fastapi uvicorn
Una vez que tengas los paquetes necesarios instalados, puedes empezar a crear tu aplicación FastAPI con soporte para WebSocket.
Creando una aplicación básica de FastAPI WebSocket
Empecemos con un ejemplo sencillo para entender los conceptos básicos de la comunicación WebSocket en FastAPI.
from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponse
app = FastAPI()
html = """
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Example</title>
</head>
<body>
<h1>WebSocket Example</h1>
<button onclick="connectWebSocket()">Connect</button>
<script>
function connectWebSocket() {
const ws = new WebSocket("ws://localhost:8000/ws");
ws.onmessage = function(event) {
const message = event.data;
alert("Message from server: " + message);
};
ws.onopen = function() {
ws.send("Hello Server");
};
}
</script>
</body>
</html>
"""
@app.get("/")
async def get():
return HTMLResponse(html)
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
data = await websocket.receive_text()
await websocket.send_text(f"Message text was: {data}")
En este ejemplo, tenemos una página HTML sencilla que se conecta a un servidor WebSocket cuando se hace clic en un botón. El servidor recibe el mensaje "Hello Server" y responde con "Message text was: Hello Server".
Manejo de múltiples conexiones
Una de las fortalezas de WebSockets es el manejo simultáneo de múltiples conexiones de clientes. Ampliemos nuestro ejemplo para manejar múltiples conexiones y transmitir mensajes a todos los clientes conectados.
from fastapi import FastAPI, WebSocket
from typing import List
app = FastAPI()
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
manager = ConnectionManager()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
await manager.broadcast(f"Client says: {data}")
except:
manager.disconnect(websocket)
En este ejemplo actualizado, introdujimos una clase ConnectionManager
para gestionar múltiples conexiones WebSocket. El método broadcast
envía un mensaje a todos los clientes conectados. De esta manera, cada cliente recibe cualquier mensaje enviado por cualquier otro cliente.
Pasando parámetros a los endpoints de WebSocket
A veces, es posible que necesites pasar parámetros a tus endpoints de WebSocket. FastAPI facilita esto. Aquí tienes un ejemplo:
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: str):
await websocket.accept()
await websocket.send_text(f"Hello, Client {client_id}")
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Message from {client_id}: {data}")
En este ejemplo, definimos un endpoint de WebSocket que acepta un parámetro client_id
. Este parámetro se puede utilizar para identificar al cliente y personalizar los mensajes.
Integrando WebSockets con endpoints de API
FastAPI te permite integrar la comunicación WebSocket con tus endpoints de API existentes. Esto es útil cuando necesitas combinar la comunicación en tiempo real con las solicitudes de API tradicionales.
from fastapi import FastAPI, WebSocket, HTTPException
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 0:
raise HTTPException(status_code=404, detail="Item not found")
return {"item_id": item_id, "name": "Item name"}
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
await websocket.send_text("Connected to WebSocket")
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Received: {data}")
En este ejemplo, tenemos un endpoint de API tradicional /items/{item_id}
junto con un endpoint de WebSocket /ws
. Ambos endpoints se pueden utilizar simultáneamente, lo que te permite manejar tanto la comunicación síncrona como la asíncrona en tu aplicación.
Consideraciones de seguridad
Cuando trabajas con WebSockets, es importante tener en cuenta los aspectos de seguridad, como la autenticación y la autorización. FastAPI proporciona herramientas para asegurar tus conexiones WebSocket.
Asegurando las conexiones WebSocket
Puedes utilizar el sistema de inyección de dependencias de FastAPI para asegurar tus endpoints de WebSocket. Aquí tienes un ejemplo de cómo asegurar un endpoint de WebSocket con una autenticación simple basada en tokens.
from fastapi import FastAPI, WebSocket, Depends, HTTPException, status
app = FastAPI()
def get_token_header(token: str = None):
if token != "mysecrettoken":
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Invalid token")
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket, token: str = Depends(get_token_header)):
await websocket.accept()
await websocket.send_text("Connected to WebSocket")
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Received: {data}")
En este ejemplo, utilizamos la función Depends
para inyectar la dependencia get_token_header
, que comprueba la validez del token. Si el token no es válido, se genera un error HTTP 403 Forbidden.
Manejo de datos binarios
WebSockets también admite la transmisión de datos binarios. Esto puede ser útil para enviar archivos o imágenes. FastAPI facilita el manejo de datos binarios.
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
await websocket.send_text("Connected to WebSocket")
while True:
data = await websocket.receive_bytes()
await websocket.send_bytes(data)
En este ejemplo, el endpoint de WebSocket recibe datos binarios utilizando receive_bytes
y los envía de vuelta al cliente utilizando send_bytes
.
Aplicaciones del mundo real de FastAPI WebSockets
WebSockets son increíblemente versátiles y se pueden utilizar en una variedad de aplicaciones del mundo real. Aquí tienes algunos ejemplos:
Aplicación de chat en tiempo real
Uno de los casos de uso más comunes para WebSockets es la construcción de aplicaciones de chat en tiempo real. Con FastAPI, puedes crear fácilmente un servidor de chat que maneje múltiples clientes y transmita mensajes en tiempo real.
Notificaciones en vivo
WebSockets son perfectos para entregar notificaciones en vivo. Por ejemplo, puedes usar WebSockets para notificar a los usuarios sobre nuevos mensajes, actualizaciones o alertas en tiempo real.
Juegos en línea
WebSockets se utilizan ampliamente en juegos en línea para permitir la comunicación en tiempo real entre los jugadores. El soporte de FastAPI para la programación asíncrona lo convierte en una excelente opción para construir servidores de juegos.
¿Cómo puedes usar Apidog para depurar un cliente WebSocket?
Gestionar APIs y datos en tiempo real puede ser un desafío. Ahí es donde entra Apidog. Apidog simplifica el desarrollo, las pruebas y la gestión de APIs, lo que facilita el manejo tanto de las solicitudes HTTP con FastAPI como de las actualizaciones en tiempo real con WebSockets.
- Abrir Apidog: Primero, inicia la aplicación Apidog y haz clic en el botón "+" en el lado izquierdo, se abrirá un nuevo menú desplegable. Desde allí, elige "Nueva API WebSocket":

2. Establecer una conexión: Comienza ingresando la URL de la API WebSocket en la barra de direcciones de Apidog. Luego, puedes hacer clic en el botón "Conectar" para iniciar el proceso de handshake y establecer una conexión. Apidog te permite personalizar parámetros como Params, Headers y Cookies durante el handshake.

3. Enviar y recibir mensajes: Una vez que se establece la conexión, puedes enviar mensajes en la pestaña "Mensaje". Puedes escribir texto, JSON, XML, HTML y otros mensajes en formato de texto, así como mensajes en formato binario utilizando Base64 o Hexadecimal. La nueva vista de línea de tiempo de Apidog muestra el estado de la conexión, los mensajes enviados y los mensajes recibidos en orden cronológico. Cuando haces clic en un mensaje, puedes ver fácilmente sus detalles.

4. Documentación de la API: Apidog hereda su robusta funcionalidad de documentación de API para las API de WebSocket, lo que te permite documentar tus interacciones de WebSocket de manera efectiva.

Recuerda verificar los problemas comunes de WebSocket, como problemas de conexión, errores de formato de mensaje y problemas de seguridad durante tu proceso de depuración.
Usando Apidog para enviar solicitudes HTTP
Apidog ofrece varias características avanzadas que mejoran aún más su capacidad para probar solicitudes HTTP. Estas características te permiten personalizar tus solicitudes y manejar escenarios más complejos sin esfuerzo.
Paso 1: Abre Apidog y crea una nueva solicitud.

Paso 2: Encuentra o ingresa manualmente los detalles de la API para la solicitud POST que deseas realizar.

Paso 3: Completa los parámetros requeridos y cualquier dato que desees incluir en el cuerpo de la solicitud.

Conclusión
FastAPI y WebSockets son una combinación poderosa para construir aplicaciones modernas en tiempo real. Ya sea que estés construyendo una aplicación de chat, un sistema de notificaciones en vivo o un juego en línea, FastAPI proporciona las herramientas que necesitas para manejar la comunicación WebSocket de manera eficiente.
No olvides descargar Apidog gratis para optimizar tu proceso de desarrollo de API. Apidog facilita la prueba y la documentación de tus APIs, ahorrándote tiempo y esfuerzo.