Parâmetros de Rota - FastAPI
Os parâmetros de rota permitem que valores específicos sejam passados diretamente no caminho da URL. No FastAPI, esses valores são vinculados automaticamente aos argumentos da função que processa a requisição. Esses parâmetros, também conhecidos como path parameters, são úteis para configurar endpoints dinâmicos e transferir informações diretamente pela URL.
Definição de Parâmetros de Rota
Parâmetros de rota são declarados diretamente na rota, delimitados por chaves {}
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{id}")
def get_user(id: int):
return {"user_id": id}
Nesse caso, o decorador app.get
"/users/{id}"
{id}
id
A função get_user()
id
Considere uma requisição para o endereço http://127.0.0.1:8000/users/315
users/315
"/users/{id}"
get_user()
O parâmetro id
"315"
id
http://127.0.0.1:8000/users/315
get_user()
id=315
O FastAPI também suporta a definição de múltiplos parâmetros de rota. Veja o exemplo abaixo:
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{name}/{age}")
def get_user(name, age):
return {"user_name": name, "user_age": age}
Nesse caso, a função get_user()
"/users/{name}/{age}"
users
name
age
Por exemplo, uma requisição para http://127.0.0.1:8000/users/Tom/38
{
"user_name": "Tom",
"user_age": "38"
}
Embora o separador padrão entre os segmentos de uma rota seja a barra (/
-
@app.get("/users/{name}-{age}")
def get_user(name, age):
return {"user_name": name, "user_age": age}
Nesse caso, uma requisição para http://127.0.0.1:8000/users/Joao-25
name
"Joao"
age
"25"
Ordem de Definição das Rotas
Ao definir rotas, é importante considerar que podem surgir ambiguidades entre elas, quando uma requisição corresponde a mais de uma rota definida. Por isso, a ordem em que as rotas são declaradas no código deve ser cuidadosamente planejada. Veja o exemplo abaixo:
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{name}")
def get_user(name):
return {"user_name": name}
@app.get("/users/admin")
def get_admin():
return {"message": "Hello admin"}
Nesse caso, queremos que as requisições para a rota "/users/admin"
get_admin()
"/users/{name}"
get_user()
No entanto, ao acessar o endereço http://127.0.0.1:8000/users/admin
get_user()
get_admin()
Isso ocorre porque a função get_user
get_admin
"/users/{name}"
Para resolver esse problema, basta trocar a ordem das definições das funções:
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/admin")
def get_admin():
return {"message": "Hello admin"}
@app.get("/users/{name}")
def get_user(name):
return {"user_name": name}
Restrições de Tipo para Parâmetros
O FastAPI permite definir restrições de tipo para os parâmetros de rota. Isso é feito especificando o tipo esperado diretamente na declaração do parâmetro. Por exemplo, podemos configurar o parâmetro id para aceitar apenas números inteiros:
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{id: int}")
def get_user(id: int):
return {"user_id": id}
Ao declarar explicitamente o tipo int
id
Além de int, o FastAPI permite especificar outros tipos de daddos, como str
float
bool
Validação de Parâmetros com a classe Path
O FastAPI fornece a classe Path
fastapi
Path
Path
: define o número mínimo de caracteres que o valor deve ter.min_length
: define o número máximo de caracteres que o valor pode ter.max_length
: aplica uma expressão regular ao valor, que deve ser correspondida.pattern
: o valor deve ser menor que o especificado.lt
: o valor deve ser menor ou igual ao especificado.le
: o valor deve ser maior que o especificado.gt
: o valor deve ser maior ou igual ao especificado.ge
Veja um exemplo de uso da classe Path
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/users/{name}")
def get_user(name: str = Path(min_length=3, max_length=20)):
return {"name": name}
Neste exemplo, o parâmetro name
Da mesma forma, podemos aplicar validações numéricas a parâmetros inteiros. Por exemplo, podemos definir que o parâmetro age
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/users/{name}/{age}")
def get_user(
name: str = Path(min_length=3, max_length=20),
age: int = Path(ge=18, lt=111)
):
return {"name": name, "age": age}
Além disso, podemos aplicar expressões regulares para validar o formato de um parâmetro. Por exemplo, podemos definir que o parâmetro phone
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/users/{phone}")
def get_phone(phone: str = Path(pattern=r"^\d{11}$")):
return {"phone": phone}