Skip to content

3. Creación de la primera API

🚀 3.1 Crear la aplicación con FastAPI()

Section titled “🚀 3.1 Crear la aplicación con FastAPI()”

La clase FastAPI es el punto de entrada de tu aplicación. Al instanciarla, creas el objeto principal que manejará todas las rutas y configuraciones.

Instancia básica
from fastapi import FastAPI
# Crear instancia de la aplicación
app = FastAPI()
# Ahora 'app' es tu aplicación FastAPI
Con metadatos
from fastapi import FastAPI
# Instancia con información de la API
app = FastAPI(
title="Mi Primera API",
description="API de ejemplo para aprender FastAPI",
version="1.0.0"
)
ParámetroDescripción
titleNombre de la API (aparece en docs)
descriptionDescripción de la API
versionVersión de la API
docs_urlURL de Swagger UI (default: /docs)
redoc_urlURL de ReDoc (default: /redoc)
Configuración completa
from fastapi import FastAPI
app = FastAPI(
title="API de Productos",
description="API para gestionar productos de una tienda",
version="2.0.0",
docs_url="/documentacion", # Cambiar URL de docs
redoc_url="/redoc"
)
# La documentación estará en /documentacion en lugar de /docs

Una ruta (o endpoint) es una URL específica que tu API expone. Cada ruta está asociada a una función que se ejecuta cuando se accede a ella.

Rutas básicas
from fastapi import FastAPI
app = FastAPI()
# Ruta raíz
@app.get("/")
def inicio():
return {"mensaje": "Página principal"}
# Ruta /about
@app.get("/about")
def acerca_de():
return {"info": "Esta es mi API"}
# Ruta /contacto
@app.get("/contacto")
def contacto():
return {"email": "contacto@miapi.com"}
Rutas con parámetros
from fastapi import FastAPI
app = FastAPI()
# Ruta con parámetro dinámico
@app.get("/usuarios/{usuario_id}")
def obtener_usuario(usuario_id: int):
return {"usuario_id": usuario_id}
# Ruta con múltiples parámetros
@app.get("/productos/{categoria}/{producto_id}")
def obtener_producto(categoria: str, producto_id: int):
return {
"categoria": categoria,
"producto_id": producto_id
}
Orden de rutas
from fastapi import FastAPI
app = FastAPI()
# ✅ Correcto: ruta específica primero
@app.get("/usuarios/me")
def usuario_actual():
return {"usuario": "Usuario actual"}
@app.get("/usuarios/{usuario_id}")
def obtener_usuario(usuario_id: int):
return {"usuario_id": usuario_id}
# ❌ Incorrecto: si inviertes el orden,
# /usuarios/me se interpretaría como /usuarios/{usuario_id}

El método GET se usa para obtener datos del servidor. No modifica información, solo la consulta.

Método GET
from fastapi import FastAPI
app = FastAPI()
# GET simple
@app.get("/")
def inicio():
return {"mensaje": "Hola"}
# GET con ruta específica
@app.get("/productos")
def listar_productos():
return [
{"id": 1, "nombre": "Laptop"},
{"id": 2, "nombre": "Mouse"}
]
Query parameters
from fastapi import FastAPI
app = FastAPI()
# Query parameters: /buscar?q=laptop&limite=10
@app.get("/buscar")
def buscar(q: str, limite: int = 10):
return {
"busqueda": q,
"limite": limite,
"resultados": []
}
# Parámetros opcionales
@app.get("/productos")
def listar_productos(categoria: str = None, precio_max: float = None):
return {
"categoria": categoria,
"precio_max": precio_max
}

📤 3.4 Respuestas simples en formato JSON

Section titled “📤 3.4 Respuestas simples en formato JSON”

FastAPI convierte automáticamente los valores de retorno a JSON:

Tipo PythonJSON resultante
dictObjeto JSON {}
listArray JSON []
strString JSON
int, floatNúmero JSON
booltrue o false
Nonenull
Tipos de respuesta
from fastapi import FastAPI
app = FastAPI()
# Respuesta como diccionario
@app.get("/usuario")
def obtener_usuario():
return {"id": 1, "nombre": "Ana", "activo": True}
# Respuesta como lista
@app.get("/usuarios")
def listar_usuarios():
return [
{"id": 1, "nombre": "Ana"},
{"id": 2, "nombre": "Carlos"}
]
# Respuesta con datos anidados
@app.get("/perfil")
def obtener_perfil():
return {
"usuario": {
"id": 1,
"nombre": "Ana"
},
"configuracion": {
"tema": "oscuro",
"idioma": "es"
}
}
Códigos de estado
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
# Respuesta con código de estado personalizado
@app.get("/creado")
def recurso_creado():
return JSONResponse(
content={"mensaje": "Recurso creado"},
status_code=201
)
# Usando el parámetro status_code del decorador
@app.get("/sin-contenido", status_code=204)
def sin_contenido():
return None

Estructura del decorador
@app.get("/ruta", parámetros...)
def nombre_funcion(parámetros_función):
return respuesta
ParámetroDescripción
pathRuta del endpoint (obligatorio)
status_codeCódigo HTTP de respuesta
tagsCategorías para documentación
summaryResumen corto
descriptionDescripción detallada
Decorador con parámetros
from fastapi import FastAPI
app = FastAPI()
@app.get(
"/productos",
tags=["Productos"],
summary="Listar productos",
description="Obtiene la lista completa de productos disponibles",
status_code=200
)
def listar_productos():
return [
{"id": 1, "nombre": "Laptop", "precio": 999.99},
{"id": 2, "nombre": "Mouse", "precio": 29.99}
]
@app.get(
"/productos/{producto_id}",
tags=["Productos"],
summary="Obtener producto por ID"
)
def obtener_producto(producto_id: int):
return {"id": producto_id, "nombre": "Laptop"}

MétodoURLDescripción
Navegadorhttp://localhost:8000/Para endpoints GET
Swagger UIhttp://localhost:8000/docsInterfaz interactiva
ReDochttp://localhost:8000/redocDocumentación alternativa
Probar en navegador
# 1. Ejecutar el servidor
uvicorn main:app --reload
# 2. Abrir navegador en:
http://localhost:8000/
# 3. Respuesta JSON:
{"mensaje": "Hola, FastAPI!"}
# 4. Probar otras rutas:
http://localhost:8000/usuarios
http://localhost:8000/productos/1
Swagger UI
# Acceder a Swagger UI
http://localhost:8000/docs
# En Swagger UI puedes:
# 1. Ver todos los endpoints disponibles
# 2. Probar cada endpoint con "Try it out"
# 3. Ver los parámetros requeridos
# 4. Ver las respuestas esperadas
# 5. Ejecutar peticiones reales
API completa para probar
from fastapi import FastAPI
app = FastAPI(
title="API de Prueba",
description="API para probar desde el navegador"
)
@app.get("/", tags=["General"])
def inicio():
return {"mensaje": "¡Bienvenido a mi API!"}
@app.get("/saludo/{nombre}", tags=["Saludos"])
def saludar(nombre: str):
return {"saludo": f"¡Hola, {nombre}!"}
@app.get("/suma", tags=["Matemáticas"])
def sumar(a: int, b: int):
return {"resultado": a + b, "operacion": f"{a} + {b}"}
# Ejecutar: uvicorn main:app --reload
# Probar:
# http://localhost:8000/
# http://localhost:8000/saludo/Ana
# http://localhost:8000/suma?a=5&b=3
# http://localhost:8000/docs

🐝