BÁSICO
DE FastAPI
MÓDULO
2 — Trabalhando com dados, parâmetros e validação
Aula 1 — Criando rotas com parâmetros
Depois
de dar os primeiros passos com FastAPI no módulo anterior, chega um momento em
que a API precisa deixar de ser estática. Até aqui, o aluno viu rotas que
sempre devolvem a mesma resposta. Isso é útil para começar, porque ajuda a
entender a estrutura básica da aplicação. Mas, no mundo real, quase nenhum
sistema funciona desse jeito o tempo todo. Aplicações de verdade precisam
responder de forma variável, de acordo com a informação recebida. É exatamente
nesse ponto que entram os parâmetros de rota.
Pensando
de forma simples, uma rota com parâmetro é uma rota que aceita uma parte
variável no endereço. Em vez de responder sempre com a mesma mensagem fixa, ela
consegue adaptar a resposta conforme o valor enviado pelo usuário. Isso faz a
API parecer mais viva, mais útil e mais próxima do tipo de sistema que
encontramos no dia a dia. É uma mudança importante porque mostra ao aluno que a
API não existe apenas para exibir mensagens prontas. Ela existe para lidar com
informações.
Para
entender isso melhor, imagine uma escola com sistema online. Se cada aluno
acessa seu perfil, não faria sentido criar uma rota diferente para cada pessoa,
como /aluno_ana, /aluno_carlos, /aluno_maria e assim por diante. Isso seria
desorganizado, pouco prático e impossível de manter quando o número de usuários
crescesse. O que se faz, em vez disso, é criar uma rota geral, como
/aluno/{nome} ou /aluno/{id}, em que a parte entre chaves representa um valor
variável. Assim, a estrutura da rota é a mesma, mas o conteúdo muda conforme a
informação enviada.
Essa
lógica é muito importante porque ajuda o aluno a perceber uma característica
central do desenvolvimento: sistemas bons não são feitos com repetição
desnecessária, mas com estruturas reutilizáveis. Em vez de escrever dezenas de
caminhos fixos, cria-se uma rota inteligente o bastante para lidar com vários
casos. Isso não só economiza trabalho, mas também torna a aplicação mais
organizada e mais coerente.
Quando uma rota recebe um parâmetro, o FastAPI captura esse valor e o entrega para a função correspondente. Na prática, isso significa que aquilo que vem no endereço passa a ser tratado como dado dentro do código. É justamente aí que o aluno começa a perceber algo essencial: uma rota não é apenas um endereço; ela também pode ser um canal de entrada de informação. Essa percepção amplia bastante o
entendimento sobre o que uma API pode fazer.
Por
exemplo, se alguém acessa uma rota como /aluno/Ana, o sistema pode responder
com uma saudação personalizada para Ana. Se outra pessoa acessa /aluno/Bruno, a
mesma estrutura de rota será usada, mas agora com o nome Bruno. O mais
importante aqui não é a sofisticação do exemplo. O mais importante é a lógica.
A API deixa de responder igual para todo mundo e passa a reagir ao valor
recebido.
Esse
tipo de recurso aparece o tempo todo em aplicações reais. Quando um site mostra
os detalhes de um produto específico, normalmente existe um identificador no
endereço. Quando um sistema abre a página de um usuário, consulta um pedido,
exibe uma matrícula ou mostra um curso, quase sempre há um parâmetro envolvido.
Isso significa que aprender parâmetros de rota não é um detalhe secundário. É
uma habilidade básica para construir aplicações úteis.
Um
ponto didático importante nesta aula é mostrar que parâmetros podem representar
diferentes tipos de informação. Eles podem ser nomes, códigos, números ou
identificadores. Em alguns casos, o sistema usa nomes por ser algo mais fácil
de visualizar. Em outros, usa números, como IDs, porque isso costuma ser mais
organizado internamente. O aluno não precisa dominar todos os modelos agora,
mas precisa perceber que o parâmetro é, no fundo, uma forma de dizer à API qual
elemento está sendo solicitado.
Também
vale destacar que o FastAPI trabalha muito bem com tipagem. Isso significa que,
ao criar um parâmetro, o desenvolvedor pode indicar que tipo de dado espera
receber. Pode ser texto, número inteiro e assim por diante. Essa informação
melhora a clareza do código e reduz margem para erro. Se a rota espera um
número e alguém tenta enviar texto em um lugar onde não deveria, o próprio
framework ajuda a identificar o problema. Para quem está aprendendo, isso é
ótimo, porque torna o comportamento da aplicação mais previsível e mais fácil
de compreender.
Esse
cuidado com tipos também ensina uma lição importante: dados não devem ser
tratados de qualquer jeito. Em programação, forma e conteúdo importam. Não
basta dizer que a API “recebe alguma coisa”. É preciso saber o que está sendo
recebido e em que formato isso faz sentido. Essa preocupação pode parecer
pequena no começo, mas ela prepara o aluno para práticas melhores no futuro,
quando os sistemas se tornam maiores e mais sensíveis a falhas.
Ao trabalhar com parâmetros de rota, o aluno também fortalece a noção de dinamismo em uma
aplicação. Até aqui, ele talvez estivesse acostumado com respostas
sempre iguais, como uma mensagem fixa de boas-vindas. Isso é um bom começo, mas
não representa bem o funcionamento de sistemas reais. Quando o endereço passa a
influenciar a resposta, o estudante começa a entender que a API pode agir com
base no contexto da requisição. Essa é uma virada importante no raciocínio.
Outra
questão relevante é evitar uma compreensão mecânica do conteúdo. Não adianta
decorar o formato de uma rota com parâmetro sem entender o motivo de usá-la.
Quem aprende só por repetição costuma se perder quando precisa adaptar o código
para outra situação. O objetivo desta aula não é formar alguém que apenas copie
/{nome} ou /{id} porque viu em um exemplo. O objetivo é formar alguém que
entenda que parâmetros existem para tornar a API capaz de responder a
diferentes solicitações com a mesma estrutura lógica.
Vamos
pensar em um exemplo muito próximo de uma plataforma educacional. Imagine uma
API simples que precisa mostrar uma mensagem para cada aluno. Em vez de criar
várias rotas fixas, a escola pode usar uma rota como /aluno/{nome}. Isso
permite personalizar a resposta com base no nome enviado. Em um primeiro
momento, esse exemplo é suficiente para mostrar a ideia. Mais adiante, em
sistemas mais robustos, provavelmente faria mais sentido usar um identificador
numérico em vez do nome. Mas, didaticamente, começar com nomes costuma
facilitar o entendimento de quem está iniciando.
Esse
tipo de abordagem também ajuda o aluno a enxergar que programação não é apenas
técnica; é também comunicação. Quando o código é claro, o raciocínio fica mais
acessível. Uma rota como /aluno/{nome} fala quase por si só. Ela comunica a
intenção de maneira simples. E isso tem valor. Quanto mais claro for o código,
maior a chance de o estudante compreender o que está fazendo e menor a chance
de transformar a aprendizagem em mera imitação.
Outro
ponto que merece atenção é que parâmetros de rota não servem apenas para
“mostrar algo personalizado”. Eles também permitem consultar registros
específicos. Em vez de exibir uma saudação, a API pode buscar informações sobre
um curso, um produto ou um pedido. Isso abre espaço para o aluno perceber que a
estrutura aprendida aqui é base para muita coisa que virá depois. Hoje, ele usa
o parâmetro para retornar uma mensagem simples. Amanhã, poderá usar a mesma
lógica para acessar dados mais relevantes em um sistema.
Do ponto de vista pedagógico, essa aula é
valiosa porque entrega um conteúdo que
já parece mais próximo de uma aplicação real, mas sem exigir complexidade
excessiva. O aluno percebe evolução. Ele não está mais apenas criando rotas
paradas. Agora está criando rotas que respondem ao que recebem. Esse tipo de
avanço fortalece a sensação de progresso, e isso é importante para manter o
engajamento no estudo.
Claro
que, nessa fase, alguns erros são comuns. Um dos mais frequentes é esquecer de
colocar o parâmetro no caminho da rota e, ainda assim, tentar usá-lo na função.
Outro erro comum é escrever o nome do parâmetro de um jeito na rota e de outro
na função. Quando isso acontece, a aplicação não entende corretamente a relação
entre o endereço e o dado esperado. Também é comum que o iniciante não perceba
a diferença entre um parâmetro tratado como texto e um parâmetro tratado como
número. Esses tropeços fazem parte do processo e não devem ser encarados como
fracasso, mas como parte da construção de familiaridade com a ferramenta.
A
melhor maneira de evitar esses erros é desenvolver um hábito simples: prestar
atenção à correspondência entre a rota e a função. O nome que aparece entre
chaves no caminho precisa ser o mesmo nome recebido como argumento. Além disso,
vale sempre perguntar: que tipo de dado essa rota faz sentido receber? Esse
tipo de checagem evita confusão e ajuda o aluno a programar com mais intenção.
Ao
final desta aula, o estudante deve sair com uma ideia clara: rotas com
parâmetros permitem que uma API responda de forma dinâmica, usando dados
enviados pelo próprio endereço. Isso torna a aplicação mais útil, mais flexível
e mais próxima das necessidades reais de um sistema. Mais do que aprender uma
nova sintaxe, o aluno passa a entender uma nova forma de pensar a construção de
APIs.
Essa compreensão é importante porque marca a transição entre uma API meramente demonstrativa e uma API que já começa a reagir ao contexto da requisição. É um passo simples, mas decisivo. Quando o aluno entende bem esse recurso, ele se prepara para trabalhar, nas próximas aulas, com filtros, consultas mais flexíveis e envio de dados mais estruturados. Em outras palavras, aprender parâmetros de rota não é um detalhe isolado. É parte da base que sustenta a evolução do desenvolvimento com FastAPI.
Referências
bibliográficas
FASTAPI.
Documentação oficial do FastAPI. [s.l.]: FastAPI, s.d.
LUTZ,
Mark. Aprendendo Python. 5. ed. Porto Alegre: Bookman, 2014.
MENEZES, Nilo Ney Coutinho. Introdução à programação
com Python. 3. ed. São
Paulo: Novatec, 2019.
RAMALHO,
Luciano. Python Fluente. 2. ed. São Paulo: Novatec, 2023.
PRESSMAN,
Roger S.; MAXIM, Bruce R. Engenharia de software: uma abordagem profissional.
8. ed. Porto Alegre: AMGH, 2016.
SOMMERVILLE,
Ian. Engenharia de software. 10. ed. São Paulo: Pearson, 2019.
Aula
2 — Query parameters: filtros simples na URL
Depois
de aprender a criar rotas com parâmetros, o aluno começa a perceber que uma API
não precisa responder sempre do mesmo jeito. Ela pode se adaptar ao que recebe.
No entanto, nem toda informação precisa fazer parte do caminho principal da
rota. Em muitos casos, o mais adequado é enviar dados complementares pela
própria URL, de forma mais flexível. É exatamente aí que entram os query
parameters, também chamados de parâmetros de consulta.
Esse
nome pode parecer técnico demais no começo, mas a ideia é bastante simples.
Query parameters são informações enviadas na URL depois de um ponto de
interrogação. Eles servem para filtrar, pesquisar, ordenar ou personalizar uma
resposta sem alterar a estrutura principal da rota. Em vez de criar vários
caminhos diferentes para cada situação, o sistema pode usar uma rota mais geral
e receber detalhes extras por meio desses parâmetros.
Pense,
por exemplo, em uma plataforma de cursos. Seria pouco prático criar uma rota
para cada tipo de busca possível, como uma rota para buscar cursos de Python,
outra para buscar cursos de banco de dados, outra para buscar cursos de
programação web e assim por diante. Isso rapidamente viraria bagunça. O mais
inteligente é criar uma rota mais ampla, como /buscar, e deixar que o termo
pesquisado seja enviado como parâmetro. Nesse caso, algo como
/buscar?curso=python já informa ao sistema o que o usuário deseja encontrar.
Perceba
o que acontece aqui: a rota continua sendo a mesma, mas a resposta pode mudar
conforme o valor enviado. Isso torna a API muito mais flexível. E
flexibilidade, em desenvolvimento, não é luxo. É necessidade. Sistemas reais
lidam com múltiplas combinações de busca, filtro e consulta. Quanto mais cedo o
aluno entende isso, mais fácil fica enxergar como as APIs funcionam fora dos
exemplos didáticos.
Uma boa forma de compreender a diferença entre parâmetros de rota e query parameters é pensar em identidade e refinamento. O parâmetro de rota normalmente ajuda a identificar algo específico dentro do caminho principal. Já o query parameter costuma refinar a consulta, ajustar a busca ou acrescentar opções. Em
outras palavras, o parâmetro de rota geralmente aponta “o que” está
sendo acessado, enquanto o query parameter ajuda a dizer “como” ou “com qual
filtro” aquilo deve ser tratado.
Essa
distinção é importante porque evita um erro muito comum de iniciante: usar tudo
da mesma forma, sem entender o papel de cada recurso. Quando a pessoa apenas
copia exemplos, tende a misturar conceitos e não consegue decidir qual
abordagem faz mais sentido em cada caso. Mas quando ela entende a lógica,
começa a enxergar melhor a intenção por trás da estrutura da API. E isso vale
muito mais do que decorar sintaxe.
Vamos
imaginar uma situação cotidiana. Uma loja virtual exibe uma lista de produtos.
O cliente quer ver apenas itens da categoria “livros”. Depois, quer ordenar por
menor preço. Talvez queira ainda limitar os resultados. Seria absurdo criar uma
rota diferente para cada combinação possível. O que se faz, na prática, é usar
query parameters. Algo como
/produtos?categoria=livros&ordem=menor_preco&limite=10 resolve a
situação de forma muito mais organizada. A rota permanece coerente, e os
filtros são enviados de maneira clara.
No
contexto do FastAPI, trabalhar com query parameters é bastante natural. Basta
declarar esses dados como argumentos da função ligada à rota. O framework
entende que, se esses argumentos não estiverem no caminho da rota, eles serão
interpretados como parâmetros de consulta. Essa simplicidade é uma das razões
pelas quais o FastAPI é didaticamente interessante. Ele ajuda o aluno a
perceber a ligação entre o que aparece na URL e o que o código recebe.
Além
disso, query parameters podem ser obrigatórios ou opcionais. Essa diferença é
extremamente útil em situações reais. Há casos em que o sistema depende de uma
informação para responder corretamente. Em outros, a API pode funcionar mesmo
que o usuário não envie nada, usando um valor padrão. Essa possibilidade de
trabalhar com valores opcionais deixa a aplicação mais amigável e mais próxima
do comportamento esperado em sistemas do dia a dia.
Imagine uma rota que exibe uma mensagem personalizada. Se o usuário informar um nome, a API responde com esse nome. Se não informar, a aplicação pode simplesmente usar um valor genérico, como “visitante”. Isso mostra ao aluno que nem tudo precisa ser rígido. Há momentos em que o sistema deve exigir dados, mas há outros em que ele pode ser mais flexível e oferecer uma resposta padrão. Essa percepção melhora bastante a qualidade do raciocínio de quem está
aprendendo.
Do
ponto de vista pedagógico, essa aula é importante porque mostra que uma API
pode receber informações sem que isso exija rotas complicadas ou estruturas
excessivas. O aluno começa a perceber que boa parte da inteligência de uma
aplicação está em como ela interpreta dados de entrada. Quanto mais clara for
essa interpretação, melhor será a experiência de uso e manutenção do sistema.
Outro
ponto que merece destaque é que query parameters aparecem o tempo todo em
sistemas reais, mesmo quando o usuário não percebe. Em sites de busca,
plataformas de cursos, lojas virtuais, painéis administrativos e aplicações de
gestão, eles são usados para filtrar resultados, paginar conteúdos, pesquisar
termos específicos, definir categorias e controlar exibições. Isso significa
que aprender esse recurso não é apenas mais uma etapa do curso. É aprender uma
ferramenta prática e amplamente usada no desenvolvimento de APIs.
Também
é importante mostrar ao aluno que query parameters não servem apenas para busca
por palavra. Eles podem ser usados para várias finalidades: limitar quantidade
de resultados, escolher páginas em uma listagem, filtrar por faixa de preço,
selecionar categoria, definir ordem de exibição e muito mais. Esse entendimento
amplia a visão sobre o papel da URL e ajuda a enxergar a API como algo mais
dinâmico e funcional.
Muitos
iniciantes, porém, cometem alguns erros previsíveis ao trabalhar com esse
recurso. Um dos mais comuns é tentar colocar o query parameter diretamente na
definição da rota, como se ele fizesse parte do caminho fixo. Outro erro
frequente é não entender que o nome usado no parâmetro precisa corresponder ao
nome esperado pela função. Também há quem acesse a rota sem enviar o parâmetro
e não compreenda por que a aplicação reclama da ausência da informação. Esses
erros são normais, mas precisam ser tratados com clareza para que o aluno não
transforme pequenas falhas em bloqueios desnecessários.
A
melhor forma de evitar esses problemas é manter um raciocínio simples e
organizado. Primeiro, perguntar: essa informação faz parte da identidade
principal da rota ou é apenas um filtro? Se for um filtro, provavelmente um
query parameter faz mais sentido. Depois, conferir se o nome usado na URL
corresponde ao nome esperado no código. Por fim, decidir se esse dado precisa
ser obrigatório ou se pode ter um valor padrão. Essas três perguntas já evitam
boa parte da confusão inicial.
Há também um aprendizado conceitual importante nesta aula:
um aprendizado conceitual importante nesta aula: nem toda entrada de
dados precisa estar escondida em formulários complexos ou em estruturas
avançadas. Às vezes, uma informação simples colocada na URL já resolve o
problema de forma elegante. Isso ajuda o aluno a perceber que desenvolvimento
não é, necessariamente, sobre criar soluções complicadas, mas sobre escolher a
forma mais adequada de resolver cada necessidade.
Em
uma plataforma educacional, por exemplo, query parameters podem ser usados para
buscar cursos por tema, filtrar por carga horária, selecionar nível de
dificuldade ou até separar cursos gratuitos dos pagos. Em um sistema de
biblioteca, podem servir para buscar livros por autor, gênero ou ano. Em uma
clínica, podem filtrar agendamentos por data ou especialidade. O padrão é
sempre o mesmo: a rota central continua organizada, e os critérios de consulta
são enviados como parâmetros adicionais.
Esse
tipo de exemplo aproxima o conteúdo da vida real e evita que o aluno enxergue a
aula como uma sequência de comandos sem contexto. A aprendizagem fica melhor
quando a pessoa percebe onde aquilo se encaixa no mundo concreto. Sem isso, o
conteúdo vira apenas repetição técnica. Com isso, ele vira compreensão.
Outro
aspecto positivo dessa aula é que ela prepara o terreno para o trabalho com
dados mais estruturados nas próximas etapas do curso. Antes de lidar com envios
mais completos no corpo da requisição, o aluno aprende a usar filtros simples
na URL. Essa progressão é didaticamente inteligente, porque vai do mais fácil
ao mais elaborado. Primeiro, entende-se como a API recebe pequenas informações
de contexto. Depois, avança-se para o recebimento de dados completos e
validação.
Ao
final da aula, o aluno deve ser capaz de perceber que query parameters são uma
forma simples, prática e poderosa de tornar as rotas mais flexíveis. Eles
permitem personalizar respostas, filtrar resultados e adaptar o comportamento
da API sem bagunçar a estrutura principal da aplicação. Mais do que aprender
uma sintaxe nova, o estudante passa a entender que uma API bem construída
depende da forma como recebe e interpreta dados.
Esse é o tipo de conteúdo que parece pequeno à primeira vista, mas faz muita diferença na prática. Uma API sem flexibilidade rapidamente se torna limitada. Já uma API que sabe receber filtros e parâmetros de consulta começa a se comportar de maneira muito mais próxima do que se espera de uma aplicação real. E é justamente esse tipo de evolução que o
o tipo de conteúdo que parece pequeno à primeira vista, mas faz muita diferença na prática. Uma API sem flexibilidade rapidamente se torna limitada. Já uma API que sabe receber filtros e parâmetros de consulta começa a se comportar de maneira muito mais próxima do que se espera de uma aplicação real. E é justamente esse tipo de evolução que o aluno precisa perceber ao longo do curso: cada novo recurso não é apenas mais um detalhe técnico, mas uma peça que amplia a utilidade e a maturidade da aplicação.
Referências
bibliográficas
FASTAPI.
Documentação oficial do FastAPI. [s.l.]: FastAPI, s.d.
MENEZES,
Nilo Ney Coutinho. Introdução à programação com Python. 3. ed. São
Paulo: Novatec, 2019.
LUTZ,
Mark. Aprendendo Python. 5. ed. Porto Alegre: Bookman, 2014.
RAMALHO,
Luciano. Python Fluente. 2. ed. São Paulo: Novatec, 2023.
SOMMERVILLE,
Ian. Engenharia de software. 10. ed. São Paulo: Pearson, 2019.
PRESSMAN,
Roger S.; MAXIM, Bruce R. Engenharia de software: uma abordagem profissional.
8. ed. Porto Alegre: AMGH, 2016.
Aula
3 — Recebendo dados com Pydantic e validando informações
Até
este ponto do curso, o aluno já entendeu que uma API pode responder a
diferentes caminhos e pode receber informações pela URL para fazer buscas e
filtros simples. Isso já é um avanço importante. Mas existe um momento em que
apenas consultar dados não basta mais. Em aplicações reais, quase sempre chega
a hora de enviar informações mais completas para a API. É o caso de um cadastro
de aluno, de um novo curso, de um pedido em uma loja, de uma mensagem enviada
por formulário ou de qualquer situação em que o sistema precise receber vários
dados ao mesmo tempo. É exatamente aqui que esta aula ganha importância.
Quando
falamos em enviar dados para uma API, estamos entrando em um nível mais próximo
da realidade do desenvolvimento. Até então, o aluno vinha observando uma API
mais como alguém que responde perguntas. Agora, a API também passa a receber
informações para processar, armazenar ou organizar. Essa mudança é importante
porque amplia o entendimento sobre o papel de uma aplicação back-end. Ela não
serve apenas para devolver respostas prontas, mas também para receber dados,
interpretar o que chegou e decidir se aquilo está correto.
É justamente nesse ponto que entra o Pydantic, uma ferramenta muito importante no ecossistema do FastAPI. Em vez de tratar os dados recebidos de forma bagunçada ou improvisada, o Pydantic permite definir uma estrutura clara para aquilo que a
API. Em vez de tratar os dados recebidos de
forma bagunçada ou improvisada, o Pydantic permite definir uma estrutura clara
para aquilo que a API espera receber. Em outras palavras, ele funciona como uma
espécie de contrato de entrada. O desenvolvedor declara quais campos são
esperados, quais tipos de informação devem ser enviados e, a partir disso, a
aplicação consegue validar automaticamente se os dados recebidos fazem sentido.
Essa
ideia de validação é central e precisa ser levada a sério. Um erro comum de
quem está começando é imaginar que qualquer dado recebido deve simplesmente ser
aceito. Isso é um pensamento fraco e perigoso. Em sistemas reais, aceitar dados
sem controle é pedir problema. Se um campo deveria receber um número e chega um
texto sem sentido, se uma informação obrigatória é omitida ou se o formato dos
dados vem errado, a API precisa perceber isso. Caso contrário, a aplicação
começa a operar com informação inconsistente, e esse tipo de bagunça cobra caro
depois.
Para
entender isso de maneira mais didática, imagine um formulário de matrícula em
uma plataforma de cursos. O sistema precisa receber, por exemplo, o nome do
aluno, a idade e a informação sobre ele estar ativo ou não. Se alguém envia a
idade como palavra em vez de número, ou deixa de informar o nome, o sistema não
deveria simplesmente seguir adiante fingindo que está tudo certo. O correto é
identificar o problema no momento da entrada. É exatamente esse tipo de cuidado
que a validação oferece.
No
FastAPI, o Pydantic facilita muito esse trabalho porque permite criar modelos
que representam a estrutura dos dados esperados. Em vez de escrever uma lógica
confusa para verificar campo por campo manualmente, o desenvolvedor define uma
classe com os atributos necessários, e o framework se encarrega de boa parte da
conferência. Isso não só deixa o código mais organizado, como também torna a
aplicação mais segura e mais coerente.
Do
ponto de vista didático, isso é excelente, porque ensina duas lições ao mesmo
tempo. A primeira é técnica: como receber dados no corpo da requisição. A
segunda é conceitual: porque não se deve confiar cegamente na entrada recebida.
Esse segundo ponto, inclusive, é um divisor de águas. Muita gente aprende
programação de forma superficial e acaba tratando os dados como se fossem
sempre corretos. Só que sistemas reais lidam com erros, preenchimentos
incompletos, formatos inesperados e uso inadequado. Quem ignora isso constrói
aplicações frágeis.
Ao criar um
modelo com Pydantic, o aluno passa a enxergar melhor a estrutura da
informação. Em vez de pensar apenas em “alguns dados chegando”, ele começa a
ver campos nomeados, tipos definidos e uma forma clara de organização. Isso
ajuda muito a desenvolver raciocínio. Um cadastro deixa de ser apenas um
conjunto aleatório de informações e passa a ser entendido como uma entidade com
características próprias. Essa forma de pensar prepara o aluno para uma etapa
mais madura do desenvolvimento, em que organizar bem os dados é tão importante
quanto fazer a aplicação responder.
Outro
aspecto interessante é que o uso do Pydantic torna o código mais legível.
Quando alguém lê uma classe representando um curso, um aluno ou um produto,
entende mais facilmente o que a API espera receber. Isso melhora a comunicação
dentro do próprio código. E comunicação importa. Código bom não é apenas o que
roda; é o que pode ser lido, entendido e mantido com clareza. Essa é uma lição
que vale desde o início. Quem aprende a organizar bem seus modelos cedo sofre
menos quando os projetos crescem.
Também
vale destacar que essa validação automática não é apenas uma conveniência, mas
uma forma de reduzir erro humano. Quando o framework aponta que um dado veio em
formato inadequado, ele está ajudando o desenvolvedor a perceber um problema
antes que esse problema se espalhe pela aplicação. Isso economiza tempo, evita
inconsistências e torna o comportamento da API mais previsível. Para quem está
começando, esse retorno é valioso porque ajuda a entender que a aplicação não
deve aceitar tudo de qualquer jeito.
Imagine,
por exemplo, uma API de cadastro de cursos. Se ela espera receber nome, carga
horária e indicação se o curso é gratuito, faz sentido que cada um desses
campos tenha um tipo adequado. O nome deve ser texto. A carga horária deve ser
numérica. A informação sobre gratuidade deve ser booleana, isto é, indicar
verdadeiro ou falso. Essa definição parece simples, mas já mostra um padrão de
organização importante. Cada dado ocupa seu lugar e cada campo tem um papel
claro.
Isso também ajuda o aluno a perceber que o corpo da requisição é diferente da URL. Enquanto parâmetros de rota e query parameters costumam lidar com informações mais curtas e contextuais, o corpo da requisição é mais adequado para envio de dados estruturados. Essa diferença é importante porque evita o uso inadequado da URL para transportar informações que deveriam ser enviadas de outra forma. Em um cadastro mais completo, por
exemplo, não faz sentido tentar colocar tudo
na rota ou na linha de consulta. O corpo da requisição existe justamente para
situações em que a API precisa receber um conjunto mais robusto de dados.
Na
prática pedagógica, esta aula marca uma evolução clara no curso. O aluno sai de
interações mais simples e passa a trabalhar com dados mais completos. Isso
aproxima o conteúdo do funcionamento real de sistemas que cadastram, atualizam
e processam informações. A API deixa de ser apenas algo que responde e passa a
ser algo que também recebe e organiza. Esse passo é importante porque amplia a
percepção sobre o papel do back-end em uma aplicação.
Claro
que, nessa fase, alguns erros aparecem com frequência. Um dos mais comuns é
definir o modelo corretamente, mas enviar os dados em formato inadequado. Outro
é esquecer que os nomes dos campos no JSON precisam corresponder aos nomes
esperados pela estrutura definida no código. Também é comum que o iniciante não
entenda por que a API rejeitou o dado quando um tipo veio errado. Em vez de
enxergar isso como problema do framework, o aluno precisa entender que esse
comportamento é justamente uma proteção. A API está dizendo, de maneira clara,
que a informação recebida não segue o padrão esperado.
Outro
erro frequente é tentar tratar tudo como texto, sem respeitar os tipos
definidos. Isso acontece porque, no início, muita gente ainda não internalizou
que tipo de dado não é enfeite, mas parte da lógica do sistema. Se um campo
representa idade, preço, quantidade ou carga horária, não faz sentido tratá-lo
de qualquer forma. O tipo existe para dar coerência ao dado e permitir que a
aplicação trabalhe com ele corretamente. Esse cuidado começa pequeno, mas faz
toda a diferença em projetos maiores.
A
melhor maneira de evitar esses erros é desenvolver um hábito simples: pensar
nos dados antes de pensar no código. O que essa API precisa receber? Quais
campos são necessários? Que tipo de informação cada campo representa? O que
deve acontecer se algum dado vier errado? Essas perguntas ajudam o aluno a sair
do impulso de apenas “fazer funcionar” e começar a programar com mais intenção.
Esse amadurecimento é um dos objetivos reais desta aula.
Outro ganho importante do uso do Pydantic no FastAPI é que ele conversa muito bem com a documentação automática. Quando o aluno acessa a interface de testes, consegue ver de maneira mais clara a estrutura esperada para envio dos dados. Isso reduz a abstração e melhora a compreensão. Em vez de
imaginar como deve
ser o corpo da requisição, ele passa a visualizar os campos e experimentar o
envio de dados de forma prática. Isso transforma o conteúdo em algo mais
concreto e menos mecânico.
Do
ponto de vista humano, esta aula costuma ser um daqueles momentos em que o
aluno começa a perceber que está, de fato, construindo algo mais próximo de
sistemas de verdade. Cadastrar um dado estruturado já parece muito mais real do
que apenas retornar uma mensagem fixa. Essa sensação de avanço importa porque
fortalece o vínculo com o aprendizado. A pessoa deixa de sentir que está apenas
fazendo exercícios artificiais e começa a enxergar conexão com aplicações
reais.
Ao
final desta aula, o mais importante é que o estudante compreenda que receber
dados em uma API não significa apenas “deixar entrar informação”. Significa
estabelecer um padrão, organizar o que é esperado e validar aquilo que foi
enviado. O Pydantic entra justamente como ferramenta que torna esse processo
mais claro, mais seguro e mais didático. Ele ajuda a estruturar melhor a
entrada de dados e mostra ao aluno que qualidade de informação também faz parte
do desenvolvimento.
Em resumo, esta aula ensina muito mais do que uma técnica específica. Ela ensina uma postura. Ensina que dados precisam ser tratados com critério. Ensina que estruturas claras facilitam manutenção e leitura. Ensina que validação não é exagero, mas necessidade. E ensina que uma API bem construída não é aquela que aceita qualquer coisa, mas aquela que sabe exatamente o que espera receber. Quando o aluno entende isso, ele dá um passo importante rumo a um desenvolvimento mais consciente e mais profissional.
Referências
bibliográficas
FASTAPI.
Documentação oficial do FastAPI. [s.l.]: FastAPI, s.d.
MENEZES,
Nilo Ney Coutinho. Introdução à programação com Python. 3. ed. São
Paulo: Novatec, 2019.
RAMALHO,
Luciano. Python Fluente. 2. ed. São Paulo: Novatec, 2023.
LUTZ,
Mark. Aprendendo Python. 5. ed. Porto Alegre: Bookman, 2014.
SOMMERVILLE,
Ian. Engenharia de software. 10. ed. São Paulo: Pearson, 2019.
PRESSMAN,
Roger S.; MAXIM, Bruce R. Engenharia de software: uma abordagem profissional.
8. ed. Porto Alegre: AMGH, 2016.
Estudo de caso do Módulo 2 — Quando a API começa a
parecer real e os erros também
Depois de concluir o Módulo 1, Lucas estava animado. Ele já tinha conseguido instalar o ambiente, criar sua primeira aplicação com FastAPI e testar rotas simples no navegador. Pela primeira vez, sentiu que não estava apenas
assistindo conteúdo
sobre programação, mas realmente construindo alguma coisa. Isso aumentou sua
confiança. E aí surgiu um problema muito comum: ele começou o Módulo 2 achando
que já tinha entendido “o mais difícil”.
Não
tinha.
O
Módulo 2 parecia, à primeira vista, uma continuação natural e tranquila.
Afinal, agora ele só precisava aprender a trabalhar com parâmetros de rota,
query parameters e envio de dados com validação. Na cabeça dele, isso era
apenas “acrescentar detalhes”. Mas logo nas primeiras tentativas ficou claro
que a situação era outra. A API começava a deixar de ser estática e passava a
reagir a dados enviados pelo usuário. E, quando uma aplicação começa a receber
dados, os erros deixam de ser apenas técnicos e passam a ser também erros de
raciocínio.
Lucas
decidiu montar uma pequena API de cursos. A ideia era simples: criar uma rota
para exibir uma mensagem com o nome do aluno, outra para pesquisar um tema e
uma terceira para cadastrar um curso. Parecia um exercício direto. O problema
foi que ele começou a programar sem pensar direito na diferença entre cada tipo
de entrada de dados.
Na
primeira parte, tentou criar uma rota para exibir uma saudação personalizada. O
objetivo era algo como /aluno/Ana. Só que ele escreveu a função esperando
receber um parâmetro chamado nome, mas esqueceu de colocar esse parâmetro no
caminho da rota. Ou seja, criou uma função com argumento, mas a rota não tinha
a parte variável correspondente. O resultado foi erro.
Esse
é um tropeço clássico. O iniciante entende mais ou menos a ideia de “receber um
valor”, mas não percebe que o caminho da rota e a função precisam conversar
entre si de forma exata. Não adianta querer usar um valor na função se esse
valor não foi declarado na rota. O FastAPI não adivinha intenção. Ele segue o
que foi definido.
Lucas
corrigiu isso, mas caiu em outro erro logo depois. Na rota, colocou algo como
/aluno/{nome}, mas, na função, escreveu def aluno(usuario: str):. Aqui o
problema era ainda mais simples: os nomes não batiam. A rota falava em nome, e
a função esperava usuario. De novo, a aplicação não funcionou como ele
imaginava.
Esse tipo de erro parece pequeno, mas revela uma falha importante de postura. Muita gente começa a programar com pressa e trata nomes como se fossem detalhe sem importância. Não são. Em programação, clareza e consistência importam muito. Se a rota define um parâmetro com um nome, a função precisa receber exatamente esse nome. Sem isso, o código perde
coerência.
Depois
de resolver a parte dos parâmetros de rota, Lucas passou para os query
parameters. Queria criar uma rota /buscar para pesquisar cursos por tema. A
ideia era acessar algo como /buscar?tema=python. Só que ele misturou os
conceitos e tentou colocar o parâmetro diretamente no caminho, como se fosse
uma parte fixa da rota. Criou algo confuso e começou a testar URLs sem entender
bem por que algumas funcionavam e outras não.
Aqui
apareceu outro erro muito comum do Módulo 2: não entender a diferença entre parâmetro
de rota e query parameter. O parâmetro de rota costuma identificar
algo dentro do caminho principal. O query parameter serve mais para
complementar, filtrar ou refinar a consulta. Quando o aluno mistura isso, a API
até pode parecer funcionar em alguns casos, mas a estrutura fica mal pensada e
ele não entende o que está fazendo.
Lucas
começou a perceber, então, que o problema não era “não saber FastAPI”. O
problema era mais básico: ele ainda não estava pensando com clareza sobre o
papel de cada entrada de dado. Isso é decisivo. Quem tenta aprender API apenas
decorando sintaxe normalmente trava quando precisa decidir como organizar a
informação.
Na
sequência, ele montou a rota de busca, mas cometeu outro erro simples: acessou
/buscar sem enviar o parâmetro esperado e estranhou quando a aplicação
reclamou. Na cabeça dele, a API deveria “entender” o que ele queria. Não
deveria. Se o parâmetro foi definido como obrigatório, a ausência dele precisa
gerar erro mesmo. Foi aí que Lucas começou a entender uma verdade importante:
sistema bem construído não funciona por adivinhação, mas por regras claras.
Isso
o ajudou a compreender melhor a diferença entre parâmetros obrigatórios e
opcionais. Quando ele passou a usar valores padrão em alguns casos, a rota
ficou mais flexível. E aí veio outro aprendizado importante do módulo: nem toda
entrada precisa ser obrigatória. Em alguns contextos, faz sentido que a API
responda mesmo sem receber tudo. Em outros, não. A questão não é “sempre
exigir” ou “sempre flexibilizar”, mas decidir com lógica.
A
parte mais desafiadora veio quando Lucas foi trabalhar com envio de dados no
corpo da requisição usando Pydantic. A proposta era cadastrar um curso com
campos como nome, carga horária e gratuidade. No papel, parecia fácil. Na
prática, ele percebeu que receber dados estruturados exige mais cuidado do que
imaginava.
Primeiro, criou o modelo, mas enviou os dados em formato errado. Em vez de respeitar os
tipos definidos, tentou mandar valores incompatíveis. Colocou texto onde
deveria haver número, omitiu campo obrigatório e se irritou quando a API
respondeu com erro de validação. Sua reação inicial foi típica de iniciante: “o
código está certo, o FastAPI que está implicando”.
Não.
O FastAPI estava fazendo exatamente o que deveria fazer.
Esse
é um ponto que precisa ser dito sem rodeios: iniciante costuma reclamar da
validação quando, na verdade, deveria agradecer por ela. Se a API aceita
qualquer dado de qualquer jeito, o sistema vira bagunça. A validação existe
para proteger a aplicação e para forçar o desenvolvedor a pensar com mais
precisão. Quando Lucas percebeu isso, deixou de ver o erro de validação como
obstáculo e começou a enxergá-lo como diagnóstico.
Em
outra tentativa, ele escreveu corretamente o modelo, mas enviou no JSON nomes
de campos diferentes dos que havia definido na classe. Queria cadastrar nome,
carga_horaria e gratuito, mas enviou algo como título, horas e free.
Obviamente, a API não reconheceu aquilo como válido.
Esse
erro é extremamente comum porque muita gente acha que basta a ideia “ser
parecida”. Em programação, “parecido” não resolve. O que vale é correspondência
exata entre o que foi definido e o que está sendo enviado. Isso obriga o aluno
a ser mais disciplinado, mais atento e menos improvisado.
Lucas
também cometeu um erro conceitual interessante: começou a querer colocar dados
complexos demais na URL, quando o mais correto seria enviá-los no corpo da
requisição. Isso mostrou que ele ainda estava tentando resolver tudo com a
lógica das rotas e dos query parameters, sem perceber que o corpo da requisição
existe justamente para envio mais estruturado de informação.
Foi
só depois de errar algumas vezes que ele começou a organizar melhor o
raciocínio. Antes de codificar, passou a se perguntar:
Que dado estou recebendo?
Esse dado faz parte do caminho principal da rota?
Esse dado é apenas um filtro?
Esse dado precisa vir em conjunto com outros campos?
Ele é obrigatório?
Que tipo de informação ele representa?
Essas
perguntas mudaram a qualidade do que ele produzia. E aqui está a lição central
do estudo de caso: o Módulo 2 não ensina apenas sintaxe de FastAPI. Ele ensina
o aluno a pensar melhor sobre entrada de dados. E isso é muito mais importante
do que parece.
Erros
comuns mostrados no caso e como evitá-los
O
primeiro erro foi usar parâmetro na função sem declará-lo corretamente na
rota.
A forma de evitar isso é simples:
se a função depende de um valor vindo do
caminho, esse valor precisa aparecer entre chaves na rota e com o mesmo nome.
O
segundo erro foi usar nomes diferentes na rota e na função.
A prevenção aqui é básica: mantenha consistência total nos nomes dos
parâmetros. Em programação, coerência não é capricho, é necessidade.
O
terceiro erro foi confundir parâmetro de rota com query parameter.
Para evitar isso, pense na função de cada um. Se o dado identifica diretamente
o recurso, faz mais sentido usar parâmetro de rota. Se o dado serve para
filtrar, pesquisar ou ajustar a consulta, geralmente faz mais sentido usar
query parameter.
O
quarto erro foi não entender quando um parâmetro é obrigatório ou opcional.
Isso se evita decidindo com clareza o comportamento esperado da rota. A API
precisa daquela informação para funcionar? Então ela deve ser obrigatória. Não
precisa? Um valor padrão pode ser suficiente.
O
quinto erro foi enviar dados incompatíveis com o modelo definido no Pydantic.
A solução é respeitar os tipos e os nomes dos campos. Se o modelo espera
número, envie número. Se espera booleano, envie booleano. Se espera determinado
nome de campo, use exatamente esse nome.
O
sexto erro foi achar que erro de validação é problema do framework.
Não é. Normalmente é o framework impedindo que você faça besteira. A melhor
forma de lidar com isso é ler a mensagem de erro com atenção e comparar com o
modelo definido.
O
sétimo erro foi tentar usar URL para transportar dados que deveriam ir no
corpo da requisição.
A saída é entender a função de cada mecanismo. Rota e query parameter servem
para contexto e filtro. Corpo da requisição serve para dados mais completos e
estruturados.
O
que esse caso ensina de verdade
No
final do módulo, Lucas percebeu que o conteúdo não era difícil porque o FastAPI
era complicado. Era difícil porque ele estava sendo obrigado a pensar com mais
precisão. No começo do curso, uma rota fixa já bastava. Agora, a API precisava
reagir a nomes, filtros e estruturas de dados. Isso exige mais cuidado, mais
clareza e menos improviso.
Esse
é o ponto em que muita gente começa a se diferenciar. Quem insiste em decorar
exemplos sem entender a lógica continua tropeçando nos mesmos erros. Quem para,
organiza o pensamento e entende a função de cada parte começa a evoluir de
verdade.
O Módulo 2 tem esse mérito: ele mostra que construir API não é só escrever rotas, mas também saber receber informação do jeito certo. E essa é uma das bases mais
importantes do desenvolvimento back-end.
Acesse materiais, apostilas e vídeos em mais de 3000 cursos, tudo isso gratuitamente!
Matricule-se AgoraAcesse materiais, apostilas e vídeos em mais de 3000 cursos, tudo isso gratuitamente!
Matricule-se Agora