Cuando creamos endpoints en FastAPI, podemos recibir datos de dos formas muy comunes:
?
en la URL./docs
.Un path parameter es un valor que se pasa directamente en la URL como parte de la ruta. Se define usando llaves { }
en el decorador.
Ejemplo:
from fastapi import FastAPI
app = FastAPI()
@app.get("/saludo/{nombre}")
def saludar(nombre: str):
return {"mensaje": f"Hola {nombre}, bienvenido a FastAPI!"}
Si abrimos en el navegador:
http://127.0.0.1:8000/saludo/Diego
{"mensaje": "Hola Diego, bienvenido a FastAPI!"}
http://127.0.0.1:8000/saludo/Maria
{"mensaje": "Hola Maria, bienvenido a FastAPI!"}
Explicación:
@app.get("/saludo/{nombre}")
: {nombre}
es un parámetro de la ruta.def saludar(nombre: str)
: FastAPI lo convierte en variable dentro de la función. El tipo str
asegura que se reciba texto.Los query parameters se pasan en la URL después de ?
y separados con &
. Se definen como argumentos de la función con valores por defecto.
Ejemplo:
@app.get("/productos")
def filtrar_productos(categoria: str | None = None, limite: int = 5):
return {
"categoria": categoria,
"limite": limite,
"mensaje": "Aquí iría la lógica para devolver productos filtrados"
}
Probar en el navegador:
http://127.0.0.1:8000/productos
{"categoria": null, "limite": 5, "mensaje": "Aquí iría la lógica para devolver productos filtrados"}
http://127.0.0.1:8000/productos?categoria=electronica
{"categoria": "electronica", "limite": 5, "mensaje": "Aquí iría la lógica para devolver productos filtrados"}
http://127.0.0.1:8000/productos?categoria=ropa&limite=2
{"categoria": "ropa", "limite": 2, "mensaje": "Aquí iría la lógica para devolver productos filtrados"}
Explicación:
categoria: str | None = None
: parámetro opcional.limite: int = 5
: parámetro con valor por defecto.Podemos usar ambos tipos de parámetros juntos en el mismo endpoint.
Ejemplo:
@app.get("/usuarios/{usuario_id}")
def obtener_usuario(usuario_id: int, activo: bool = True):
return {
"usuario_id": usuario_id,
"activo": activo
}
Probar en el navegador:
http://127.0.0.1:8000/usuarios/10
{"usuario_id": 10, "activo": true}
http://127.0.0.1:8000/usuarios/10?activo=false
{"usuario_id": 10, "activo": false}
Explicación:
usuario_id
viene de la ruta (Path).activo
viene de la query (Query)./saludo/Diego
).?
en la URL (/productos?categoria=ropa
).Queremos construir un traductor básico que reciba una palabra en castellano y devuelva su traducción a otro idioma.
Endpoint
GET /traducir/{palabra}
Base de datos simulada (diccionario)
diccionario = {
"hola": {"en": "hello", "fr": "bonjour", "it": "ciao"},
"perro": {"en": "dog", "fr": "chien", "it": "cane"},
"gato": {"en": "cat", "fr": "chat", "it": "gatto"},
"casa": {"en": "house", "fr": "maison", "it": "casa"},
"gracias": {"en": "thank you", "fr": "merci", "it": "grazie"}
}
{palabra}
: palabra en castellano que se quiere traducir.
idioma
(str): idioma destino (en
, fr
, it
). Por defecto, si no se envía, debe devolver la traducción en inglés (en
).
{"detail": "Palabra no encontrada"}
.{"detail": "Idioma no soportado"}
.Traducción por defecto (inglés)
/traducir/hola
{"palabra":"hola","traduccion":"hello","idioma":"en"}
Traducción a francés (query param)
/traducir/gato?idioma=fr
{"palabra":"gato","traduccion":"chat","idioma":"fr"}
Traducción a italiano
/traducir/perro?idioma=it
{"palabra":"perro","traduccion":"cane","idioma":"it"}
Palabra no encontrada
/traducir/arbol
{"detail":"Palabra no encontrada"}
Idioma no soportado
/traducir/hola?idioma=de
{"detail":"Idioma no soportado"}
@app.get("/traducir/{palabra}")
def traducir(palabra: str, idioma: str = "en"):
...
palabra.lower()
)..get()
en el diccionario para acceder a las traducciones.idioma
exista dentro de los valores posibles (en
, fr
, it
).