Portal IDEA

Básico de FastAPI

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.

Quer acesso gratuito a mais materiais como este?

Acesse materiais, apostilas e vídeos em mais de 3000 cursos, tudo isso gratuitamente!

Matricule-se Agora