💻 Exemplos: Capítulo 03: Parâmetros de Rota (Path), Consulta (Query), Headers e Body
Especialização em Backend com Python & FastAPI • Demonstrações Práticas Compiláveis
💻 Exemplo 1 — Path e Query Parameters com Validação
from typing import Optional
from fastapi import FastAPI, Path, Query
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(
item_id: int = Path(..., ge=1, description="ID do item positivo"),
q: Optional[str] = Query(None, min_length=3, max_length=50, description="Busca opcional"),
):
return {"item_id": item_id, "filtro": q}
💻 Exemplo 2 — Body com Múltiplos Modelos e Headers Customizados
from typing import Optional
from fastapi import FastAPI, Body, Header, Cookie, HTTPException, status
from pydantic import BaseModel
app = FastAPI()
class ClienteRef(BaseModel):
cliente_id: int
nome: str
class ItemPedido(BaseModel):
produto_id: int
quantidade: int
preco_unitario: float
@app.post("/pedidos", status_code=status.HTTP_201_CREATED)
async def criar_pedido(cliente: ClienteRef = Body(...), itens: list[ItemPedido] = Body(...)):
total = sum(item.quantidade * item.preco_unitario for item in itens)
return {"cliente": cliente.nome, "total": total, "qtd_itens": len(itens)}
@app.get("/tenant-info")
async def obter_tenant(
x_tenant_id: str = Header(..., description="ID da organização"),
session_id: Optional[str] = Cookie(None),
):
if not x_tenant_id.startswith("corp_"):
raise HTTPException(status_code=400, detail="Tenant ID inválido")
return {"tenant": x_tenant_id, "session_active": session_id is not None}
💻 Exemplo 3 — Upload de Arquivo com Validação de Mime-Type e Tamanho
from fastapi import FastAPI, UploadFile, File, HTTPException
app = FastAPI()
MAX_FILE_SIZE = 5 * 1024 * 1024 # 5 MB
@app.post("/upload-documento")
async def upload_documento(arquivo: UploadFile = File(...)):
if arquivo.content_type not in {"application/pdf", "image/png"}:
raise HTTPException(status_code=415, detail="Tipo de mídia não suportado")
conteudo = await arquivo.read()
if len(conteudo) > MAX_FILE_SIZE:
raise HTTPException(status_code=413, detail="Arquivo excede o limite de 5MB")
return {"filename": arquivo.filename, "tamanho_bytes": len(conteudo)}