committed by
GitHub
2 changed files with 225 additions and 0 deletions
@ -0,0 +1,224 @@ |
|||
# Parâmetros de Consulta |
|||
|
|||
Quando você declara outros parâmetros na função que não fazem parte dos parâmetros da rota, esses parâmetros são automaticamente interpretados como parâmetros de "consulta". |
|||
|
|||
```Python hl_lines="9" |
|||
{!../../../docs_src/query_params/tutorial001.py!} |
|||
``` |
|||
|
|||
A consulta é o conjunto de pares chave-valor que vai depois de `?` na URL, separado pelo caractere `&`. |
|||
|
|||
Por exemplo, na URL: |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/?skip=0&limit=10 |
|||
``` |
|||
|
|||
...os parâmetros da consulta são: |
|||
|
|||
* `skip`: com o valor `0` |
|||
* `limit`: com o valor `10` |
|||
|
|||
Como eles são parte da URL, eles são "naturalmente" strings. |
|||
|
|||
Mas quando você declara eles com os tipos do Python (no exemplo acima, como `int`), eles são convertidos para aquele tipo e validados em relação a ele. |
|||
|
|||
Todo o processo que era aplicado para parâmetros de rota também é aplicado para parâmetros de consulta: |
|||
|
|||
* Suporte do editor (obviamente) |
|||
* <abbr title="convertendo uma string que vem de um request HTTP em um dado Python">"Parsing"</abbr> de dados |
|||
* Validação de dados |
|||
* Documentação automática |
|||
|
|||
## Valores padrão |
|||
|
|||
Como os parâmetros de consulta não são uma parte fixa da rota, eles podem ser opcionais e podem ter valores padrão. |
|||
|
|||
No exemplo acima eles tem valores padrão de `skip=0` e `limit=10`. |
|||
|
|||
Então, se você for até a URL: |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/ |
|||
``` |
|||
|
|||
Seria o mesmo que ir para: |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/?skip=0&limit=10 |
|||
``` |
|||
|
|||
Mas, se por exemplo você for para: |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/?skip=20 |
|||
``` |
|||
|
|||
Os valores dos parâmetros na sua função serão: |
|||
|
|||
* `skip=20`: Por que você definiu isso na URL |
|||
* `limit=10`: Por que esse era o valor padrão |
|||
|
|||
## Parâmetros opcionais |
|||
|
|||
Da mesma forma, você pode declarar parâmetros de consulta opcionais, definindo o valor padrão para `None`: |
|||
|
|||
=== "Python 3.6 and above" |
|||
|
|||
```Python hl_lines="9" |
|||
{!> ../../../docs_src/query_params/tutorial002.py!} |
|||
``` |
|||
|
|||
=== "Python 3.10 and above" |
|||
|
|||
```Python hl_lines="7" |
|||
{!> ../../../docs_src/query_params/tutorial002_py310.py!} |
|||
``` |
|||
|
|||
Nesse caso, o parâmetro da função `q` será opcional, e `None` será o padrão. |
|||
|
|||
!!! check "Verificar" |
|||
Você também pode notar que o **FastAPI** é esperto o suficiente para perceber que o parâmetro da rota `item_id` é um parâmetro da rota, e `q` não é, portanto, `q` é o parâmetro de consulta. |
|||
|
|||
|
|||
## Conversão dos tipos de parâmetros de consulta |
|||
|
|||
Você também pode declarar tipos `bool`, e eles serão convertidos: |
|||
|
|||
=== "Python 3.6 and above" |
|||
|
|||
```Python hl_lines="9" |
|||
{!> ../../../docs_src/query_params/tutorial003.py!} |
|||
``` |
|||
|
|||
=== "Python 3.10 and above" |
|||
|
|||
```Python hl_lines="7" |
|||
{!> ../../../docs_src/query_params/tutorial003_py310.py!} |
|||
``` |
|||
|
|||
Nesse caso, se você for para: |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/foo?short=1 |
|||
``` |
|||
|
|||
ou |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/foo?short=True |
|||
``` |
|||
|
|||
ou |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/foo?short=true |
|||
``` |
|||
|
|||
ou |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/foo?short=on |
|||
``` |
|||
|
|||
ou |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/foo?short=yes |
|||
``` |
|||
|
|||
ou qualquer outra variação (tudo em maiúscula, primeira letra em maiúscula, etc), a sua função vai ver o parâmetro `short` com um valor `bool` de `True`. Caso contrário `False`. |
|||
|
|||
## Múltiplos parâmetros de rota e consulta |
|||
|
|||
Você pode declarar múltiplos parâmetros de rota e parâmetros de consulta ao mesmo tempo, o **FastAPI** vai saber o quê é o quê. |
|||
|
|||
E você não precisa declarar eles em nenhuma ordem específica. |
|||
|
|||
Eles serão detectados pelo nome: |
|||
|
|||
=== "Python 3.6 and above" |
|||
|
|||
```Python hl_lines="8 10" |
|||
{!> ../../../docs_src/query_params/tutorial004.py!} |
|||
``` |
|||
|
|||
=== "Python 3.10 and above" |
|||
|
|||
```Python hl_lines="6 8" |
|||
{!> ../../../docs_src/query_params/tutorial004_py310.py!} |
|||
``` |
|||
|
|||
## Parâmetros de consulta obrigatórios |
|||
|
|||
Quando você declara um valor padrão para parâmetros que não são de rota (até agora, nós vimos apenas parâmetros de consulta), então eles não são obrigatórios. |
|||
|
|||
Caso você não queira adicionar um valor específico mas queira apenas torná-lo opcional, defina o valor padrão como `None`. |
|||
|
|||
Porém, quando você quiser fazer com que o parâmetro de consulta seja obrigatório, você pode simplesmente não declarar nenhum valor como padrão. |
|||
|
|||
```Python hl_lines="6-7" |
|||
{!../../../docs_src/query_params/tutorial005.py!} |
|||
``` |
|||
|
|||
Aqui o parâmetro de consulta `needy` é um valor obrigatório, do tipo `str`. |
|||
|
|||
Se você abrir no seu navegador a URL: |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/foo-item |
|||
``` |
|||
|
|||
... sem adicionar o parâmetro obrigatório `needy`, você verá um erro como: |
|||
|
|||
```JSON |
|||
{ |
|||
"detail": [ |
|||
{ |
|||
"loc": [ |
|||
"query", |
|||
"needy" |
|||
], |
|||
"msg": "field required", |
|||
"type": "value_error.missing" |
|||
} |
|||
] |
|||
} |
|||
``` |
|||
|
|||
Como `needy` é um parâmetro obrigatório, você precisaria defini-lo na URL: |
|||
|
|||
``` |
|||
http://127.0.0.1:8000/items/foo-item?needy=sooooneedy |
|||
``` |
|||
|
|||
...isso deve funcionar: |
|||
|
|||
```JSON |
|||
{ |
|||
"item_id": "foo-item", |
|||
"needy": "sooooneedy" |
|||
} |
|||
``` |
|||
|
|||
E claro, você pode definir alguns parâmetros como obrigatórios, alguns possuindo um valor padrão, e outros sendo totalmente opcionais: |
|||
|
|||
=== "Python 3.6 and above" |
|||
|
|||
```Python hl_lines="10" |
|||
{!> ../../../docs_src/query_params/tutorial006.py!} |
|||
``` |
|||
|
|||
=== "Python 3.10 and above" |
|||
|
|||
```Python hl_lines="8" |
|||
{!> ../../../docs_src/query_params/tutorial006_py310.py!} |
|||
``` |
|||
Nesse caso, existem 3 parâmetros de consulta: |
|||
|
|||
* `needy`, um `str` obrigatório. |
|||
* `skip`, um `int` com o valor padrão `0`. |
|||
* `limit`, um `int` opcional. |
|||
|
|||
!!! tip "Dica" |
|||
Você também poderia usar `Enum` da mesma forma que com [Path Parameters](path-params.md#predefined-values){.internal-link target=_blank}. |
Loading…
Reference in new issue