Parámetros de Consulta - FastAPI
Os parâmetros de consulta (query string) são usados para passar informações para a API através da URL, por meio da URL em requisições do tipo GET. Antes de explorar seu funcionamento, é importante compreender o conceito de consulta. Considere o seguinte exemplo de URL:
http://127.0.0.1:8000/users/add?name=Tom&age=38
Neste caso:
A parte que aparece após o endereço do servidor e a porta, mas antes do caractere
— ou seja,?
— representa o caminho da rota (path).users/add
A parte que aparece após o
, ou seja,?
, é a query string ou parâmetros de consulta.name=Tom&age=38
Os parâmetros de consulta consistem em pares de chave e valor, separados pelo símbolo =
O parâmetro
tem o valorname
."Tom"
O parâmetro
tem o valorage
.38
Se houver múltiplos parâmetros, eles são separados pelo caractere ampersand &
Obtendo Valores dos Parâmetros de Consulta
Para acessar os valores de parâmetros de consulta em uma aplicação FastAPI, basta defini-los como argumentos da função associada à rota:
from fastapi import FastAPI
app = FastAPI()
@app.get("/users")
def get_model(name, age):
return {"user_name": name, "user_age": age}
Neste caso, ao receber uma requisição como /users?name=Tom&age=38
name
age
Valores Padrão para Parâmetros de Consulta
Em alguns casos, os usuários podem não fornecer todos os parâmetros esperados. No exemplo anterior, ambos os parâmetros são obrigatórios, e a ausência de qualquer um deles resultaria em um erro. Para evitar isso, é possível atribuir valores padrão aos parâmetros:
from fastapi import FastAPI
app = FastAPI()
@app.get("/users")
def get_model(name="Undefined", age=18):
return {"user_name": name, "user_age": age}
Com essa configuração:
Se o parâmetro
não for fornecido, o valorname
será utilizado."Undefined"
Se o parâmetro
não for fornecido, o valor padrão seráage
.18
Por exemplo, a requisição /users?name=Tom
{"user_name": "Tom", "user_age": 18}
Parâmetros com valores padrão devem ser declarados após parâmetros obrigatórios, para evitar conflitos de ordem.
Restrições de Tipo nos Parâmetros de Consulta
O FastAPI também permite aplicar restrições de tipo aos parâmetros, garantindo que os valores fornecidos atendam aos requisitos esperados:
from fastapi import FastAPI
app = FastAPI()
@app.get("/users")
def get_model(name: str, age: int = 18):
return {"user_name": name, "user_age": age}
Aqui:
O parâmetro
deve ser uma string (name
).str
O parâmetro
deve ser um número inteiro (age
) e, se não for fornecido, será atribuído o valor padrãoint
.18
Se o tipo de dado enviado não for compatível — por exemplo, um valor não numérico para age
Parâmetros de Consulta com a Classe Query
O FastAPI oferece a classe Query
fastapi
Validações com a Classe Query
A classe Query
: Define o número mínimo de caracteres permitidos para o valor.min_length
: Define o número máximo de caracteres permitidos para o valor.max_length
: Aplica uma validação baseada em uma expressão regular.pattern
: Garante que o valor seja menor que um número definido.lt
: Garante que o valor seja menor ou igual a um número definido.le
: Garante que o valor seja maior que um número definido.gt
: Garante que o valor seja maior ou igual a um número definido.ge
Exemplo Básico de Validação
No exemplo a seguir, validamos o parâmetro name
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/users")
def users(name: str = Query(min_length=3, max_length=20)):
return {"name": name}
Aqui, o parâmetro name
Deve conter pelo menos 3 caracteres.
Não pode ultrapassar 20 caracteres.
Múltiplas Validações
Com a classe Query
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/users")
def users(
name: str = Query(min_length=3, max_length=20),
age: int = Query(ge=18, lt=111)
):
return {"name": name, "age": age}
Neste caso:
O parâmetro
deve ter entre 3 e 20 caracteres.name
O parâmetro
deve ser um número entre 18 (inclusive) e 111 (exclusivo).age
Validação com Expressões Regulares
O argumento pattern
phone
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/users")
def users(phone: str = Query(pattern=r"^\d{11}$")):
return {"phone": phone}
Se o valor enviado não corresponder ao padrão definido pela expressão regular, um erro de validação será retornado automaticamente.
Definindo Valores Padrão
Também é possível definir valores padrão para parâmetros usando o argumento default
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/users")
def users(name: str = Query(default="Undefined", min_length=2)):
return {"name": name}
Se o parâmetro name
"Undefined"
Parâmetros opcionais
Para tornar um parâmetro opcional, basta definir seu valor padrão como None
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/users")
def users(name: str | None = Query(default=None, min_length=2)):
if name is None:
return {"name": "Undefined"}
else:
return {"name": name}
Aqui, se o parâmetro name
"Undefined"
Recebendo Listas de Valores
A classe Query
http://127.0.0.1:8000/users?people=Tom&people=Sam&people=Bob
O código abaixo ilustra como capturar esses valores como uma lista:
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/users")
def users(people: list[str] = Query()):
return {"people": people}
Neste caso, o parâmetro people
["tom", "Sam", "Bob"]
Combinando Parâmetros de Rota e Consulta
Por fim, é possível combinar parâmetros de rota com parâmetros de consulta em uma mesma rota. Veja o exemplo:
from fastapi import FastAPI, Path, Query
app = FastAPI()
@app.get("/users/{name}")
def users(
name: str = Path(min_length=3, max_length=20),
age: int = Query(ge=18, lt=111)
):
return {"name": name, "age": age}
Aqui:
O parâmetro
é um parâmetro de rota, cuja validação exige entre 3 e 20 caracteres.name
O parâmetro
é um parâmetro de consulta, que deve ser um número entre 18 (inclusive) e 111 (exclusivo).age
Por exemplo, a requisição para o endereço:
http://127.0.0.1:8000/users/Tom?age=38
Resultará na resposta:
{
"name": "Tom",
"age": 38
}