BÁSICO
DE FastAPI
MÓDULO
3 — Organizando uma API básica e criando um projeto prático
Aula
1 — Métodos HTTP na prática: GET, POST, PUT e DELETE
À
medida que o aluno avança no estudo de APIs, chega um momento em que não basta
mais entender rotas, parâmetros e validação de dados de forma isolada. É
preciso enxergar a aplicação como algo que realmente executa ações diferentes
conforme a necessidade do sistema. É exatamente nesse ponto que entram os
métodos HTTP. Eles ajudam a definir o tipo de operação que está sendo realizada
em uma API. Em termos simples, eles mostram a intenção da requisição. Não se
trata apenas de acessar um endereço, mas de deixar claro o que se quer fazer
com aquele recurso.
Essa
distinção é essencial porque, em uma aplicação real, nem toda interação
significa a mesma coisa. Há situações em que o usuário apenas quer visualizar
informações. Em outras, deseja cadastrar algo novo. Em alguns casos, precisa
atualizar um dado existente. Em outros, quer remover uma informação que não faz
mais sentido permanecer no sistema. Se tudo isso fosse tratado da mesma forma,
a API ficaria confusa, mal organizada e muito mais difícil de manter. Os
métodos HTTP existem justamente para dar ordem a essas ações.
O
primeiro método que normalmente aparece no aprendizado é o GET. Ele é
usado quando a intenção é buscar ou consultar informações. Quando alguém acessa
uma lista de cursos, consulta os dados de um aluno, visualiza os detalhes de um
produto ou lê uma informação disponível em um sistema, geralmente está
acontecendo uma requisição do tipo GET. Ele é, por assim dizer, o método da
leitura. Sua função principal é pedir dados ao servidor e receber esses dados
de volta, sem que isso, em princípio, altere o conteúdo armazenado.
Para
quem está começando, uma boa comparação é pensar em uma biblioteca. Quando a
pessoa entra e procura um livro no catálogo, ela está apenas consultando a
informação. Não está criando um livro novo, nem reescrevendo o conteúdo do
acervo, nem destruindo nada. Está apenas pedindo acesso a algo que já existe. O
GET funciona desse jeito. Ele é usado para leitura e recuperação de dados. Essa
lógica pode parecer óbvia, mas é importante deixar isso claro desde o início,
porque muita gente começa a usar métodos sem entender a diferença entre
consultar e modificar.
Depois vem o POST, que é usado quando a intenção é criar um dado. Em uma API, isso acontece em situações como cadastrar um curso, registrar um aluno, criar um pedido,
adicionar um produto ou salvar uma nova informação no sistema. O
POST marca o momento em que a aplicação deixa de apenas mostrar algo e passa a
receber algo novo para ser incluído. Em termos práticos, ele representa a
criação.
Retomando
a analogia da biblioteca, seria como o momento em que um novo livro entra
oficialmente no acervo. Não se trata mais de procurar um item existente, mas de
incluir uma nova obra no sistema. Essa comparação ajuda porque mostra ao aluno
que a API não vive só de consulta. Ela também participa da construção e
ampliação da base de dados do sistema. É justamente aí que o desenvolvimento
começa a parecer mais real, porque aplicações verdadeiras dependem o tempo todo
de criação de registros.
O
terceiro método importante é o PUT, utilizado para atualização. Quando
um dado já existe, mas precisa ser modificado, esse método passa a fazer
sentido. Pense em um curso que teve sua descrição alterada, em um cadastro de
aluno que precisou de correção ou em um produto cujo preço foi atualizado.
Nesses casos, não estamos criando algo do zero, nem apenas consultando
informações. Estamos mudando o que já estava registrado.
Esse
ponto é importante porque muitos iniciantes confundem criação com atualização.
Às vezes, tratam qualquer envio de dados como se fosse POST. Só que isso produz
uma lógica ruim. Criar e atualizar não são a mesma coisa. Criar introduz algo
novo. Atualizar altera algo que já existe. Essa separação melhora a organização
da API e deixa mais claro o que cada rota está fazendo. Além disso, ajuda a
manter o sistema coerente, especialmente quando a aplicação cresce e passa a
lidar com mais volume de informação.
Na
analogia da biblioteca, o PUT seria como corrigir os dados de um livro já
cadastrado. Talvez o nome do autor tenha sido registrado com erro. Talvez a
edição precise ser atualizada. Talvez a classificação tenha mudado. O livro
continua existindo, mas algumas informações relacionadas a ele precisam ser
ajustadas. O método PUT cumpre esse papel de alteração.
Por fim, temos o DELETE, que é usado quando a intenção é remover um dado. É o método ligado à exclusão. Se um curso precisa ser apagado da lista, se um cadastro foi criado por engano ou se um registro deixou de fazer sentido, o DELETE pode ser utilizado para indicar que aquele recurso deve ser removido. Aqui também é importante ter clareza conceitual. Excluir não é o mesmo que consultar, nem criar, nem atualizar. É outra ação, com outra intenção, e por isso merece um
que é usado quando a intenção é remover um dado. É
o método ligado à exclusão. Se um curso precisa ser apagado da lista, se um
cadastro foi criado por engano ou se um registro deixou de fazer sentido, o
DELETE pode ser utilizado para indicar que aquele recurso deve ser removido.
Aqui também é importante ter clareza conceitual. Excluir não é o mesmo que
consultar, nem criar, nem atualizar. É outra ação, com outra intenção, e por
isso merece um método específico.
Na
prática, essa separação entre métodos deixa a API mais compreensível e mais
organizada. Quando alguém olha para uma rota com GET, já entende que a intenção
ali é obter informações. Quando vê POST, entende que algo está sendo criado.
Quando encontra PUT, percebe que existe uma atualização. E, com DELETE, sabe
que há uma exclusão envolvida. Essa clareza não é detalhe. Ela melhora o
desenvolvimento, a manutenção e a leitura do sistema por qualquer pessoa que
venha a trabalhar com aquela API depois.
Do
ponto de vista didático, essa aula é uma das mais importantes do curso porque
ajuda o aluno a deixar de enxergar a API como uma coleção de endereços e passar
a entendê-la como um conjunto de operações organizadas. Até aqui, ele já viu
rotas, parâmetros, filtros e validação. Agora, começa a perceber que a API
também expressa ações diferentes sobre os dados. Isso muda bastante a qualidade
do entendimento. A aplicação passa a ser vista de forma mais completa.
Imagine
uma plataforma de cursos livres. O sistema pode precisar listar todos os cursos
disponíveis. Nesse caso, o método adequado seria GET. Se for necessário
cadastrar um novo curso, entra o POST. Se a descrição de um curso precisar ser
corrigida, faz sentido usar PUT. Se um curso obsoleto tiver de ser removido,
DELETE se torna apropriado. O mais interessante aqui é notar que, embora o
recurso central continue sendo “curso”, as ações sobre ele mudam. E os métodos
HTTP servem justamente para organizar essa diferença.
Essa
organização também contribui para uma visão mais profissional do
desenvolvimento. Um dos erros mais comuns de quem está começando é pensar
apenas no código que “funciona”, sem se preocupar com a qualidade da estrutura.
O problema é que um sistema pode funcionar e, ao mesmo tempo, estar mal
desenhado. Quando os métodos são usados corretamente, a API fica mais limpa,
mais lógica e mais próxima das boas práticas do desenvolvimento web. Isso não é
frescura técnica. É uma forma de evitar bagunça futura.
Outro ponto importante é
que os métodos HTTP ajudam a comunicar intenção não só para
o programador, mas também para outros sistemas e para outras pessoas que
trabalham no projeto. Em ambientes reais, APIs quase nunca são construídas para
uso isolado. Elas são consumidas por front-end, aplicativos móveis, integrações
externas, dashboards administrativos e diferentes equipes. Quanto mais clara
for a estrutura da API, mais fácil será para todos entenderem como interagir
com ela.
Também
é relevante destacar que o aluno não deve decorar os métodos apenas como uma
lista. Isso seria um erro didático. O que realmente importa é compreender a
lógica por trás deles. GET busca. POST cria. PUT atualiza. DELETE remove.
Quando essa lógica está clara, a memorização deixa de ser esforço artificial e
passa a ser consequência natural do entendimento. O problema começa quando o
estudante tenta apenas repetir nomes sem conectar cada um à sua função real.
É
comum que, nessa fase, apareçam alguns erros de interpretação. Um dos mais
frequentes é usar POST para tudo, como se qualquer interação com a API
dependesse apenas desse método. Isso acontece porque muitos iniciantes entendem
melhor a ideia de “enviar dados” do que a diferença entre criar, alterar e
remover. Outro erro comum é não perceber que GET deveria ser usado apenas para
consulta, e não para executar ações que modificam o sistema. Quando isso
acontece, a aplicação até pode rodar, mas sua lógica fica confusa e mal
organizada.
A
melhor forma de evitar esses erros é sempre perguntar: o que essa requisição
quer fazer? Quer apenas ler uma informação? Então faz sentido usar GET. Quer
criar algo? Então POST é mais adequado. Quer modificar algo já existente? PUT.
Quer apagar? DELETE. Essa pergunta simples ajuda muito a organizar a cabeça de
quem está aprendendo. E, em programação, organizar a cabeça vale mais do que
decorar meia dúzia de comandos.
Há
também uma lição mais ampla por trás desta aula. Entender métodos HTTP é
entender que desenvolvimento não é só escrever funções, mas modelar ações de
forma coerente. A API é uma interface de comunicação. E toda interface precisa
ser clara. Quando cada ação tem seu método apropriado, a aplicação transmite
melhor sua lógica. Isso melhora a experiência de quem desenvolve, de quem testa
e de quem usa.
No contexto do FastAPI, essa organização se torna ainda mais visível porque a definição das rotas costuma ser bastante clara. O aluno consegue ver, no próprio código, qual método está associado a cada
operação. Isso ajuda a
consolidar a aprendizagem, porque o conteúdo não fica apenas na teoria. Ele
aparece diretamente na prática da construção da API. A sintaxe do framework,
nesse caso, contribui para que a lógica dos métodos fique mais concreta e menos
abstrata.
Ao final desta aula, o mais importante é que o aluno compreenda que os métodos HTTP não são nomes soltos nem regras arbitrárias. Eles existem para dar sentido às ações realizadas dentro da API. GET, POST, PUT e DELETE representam formas diferentes de interação com os dados e ajudam a organizar o comportamento do sistema de maneira lógica. Quando essa base fica bem entendida, o aluno passa a enxergar a API com mais maturidade.
Em resumo, esta aula marca uma etapa importante no curso porque transforma a forma como o estudante interpreta as rotas. Ele deixa de ver apenas caminhos que retornam respostas e começa a enxergar operações com intenções específicas. Isso aproxima o aprendizado do funcionamento real de aplicações modernas e prepara o terreno para a construção de projetos mais completos, mais organizados e mais coerentes. É justamente esse tipo de entendimento que faz o aluno evoluir de alguém que apenas copia estruturas para alguém que começa, de fato, a pensar como desenvolvedor.
Referências
bibliográficas
FASTAPI.
Documentação oficial do FastAPI. [s.l.]: FastAPI, s.d.
FIELDING,
Roy Thomas. Architectural Styles and the Design of Network-based Software
Architectures. Irvine: University of California, 2000.
MENEZES,
Nilo Ney Coutinho. Introdução à programação com Python. 3. ed. São
Paulo: Novatec, 2019.
PRESSMAN,
Roger S.; MAXIM, Bruce R. Engenharia de software: uma abordagem profissional.
8. ed. Porto Alegre: AMGH, 2016.
RAMALHO,
Luciano. Python Fluente. 2. ed. São Paulo: Novatec, 2023.
SOMMERVILLE,
Ian. Engenharia de software. 10. ed. São Paulo: Pearson, 2019.
Aula
2 — Organizando melhor o projeto e usando listas temporárias
Até aqui, o aluno já percorreu um caminho importante. Primeiro, entendeu o que é uma API e por que ela existe. Depois, começou a criar rotas, trabalhar com parâmetros, receber dados e compreender melhor a lógica dos métodos HTTP. Agora surge uma nova necessidade: começar a pensar em organização. E esse ponto merece atenção, porque muita gente aprende a programar focando apenas em “fazer funcionar”, sem perceber que um sistema pode até rodar, mas ainda assim estar mal organizado. Quando isso acontece, o problema não aparece de imediato. Ele aparece
depois, quando o projeto cresce, quando surgem novas demandas e quando
o próprio autor do código já não entende mais com clareza o que escreveu.
Essa
aula é importante justamente porque começa a introduzir uma visão mais madura
do desenvolvimento. Não estamos falando ainda de um projeto grande, com
múltiplos arquivos, banco de dados complexo e arquitetura robusta. Seria cedo
demais para isso. O foco aqui é outro: mostrar ao aluno que até mesmo uma API
simples precisa de um mínimo de organização para continuar compreensível. E,
além disso, mostrar uma estratégia didática muito útil para quem ainda não está
trabalhando com banco de dados: o uso de listas temporárias em memória.
Quando
o aluno começa a programar, é comum colocar tudo em um único arquivo e achar
que isso basta. No começo, realmente basta. Não faz sentido complicar demais
uma aplicação introdutória. O problema começa quando a pessoa se acostuma com a
bagunça e passa a tratar desorganização como se fosse normal. Não é. Um projeto
pequeno pode até caber em um arquivo só, mas isso não elimina a necessidade de
pensar com clareza sobre a função de cada parte do código. Organização não é
frescura. É o que impede que um exercício simples vire uma confusão
desnecessária.
Pense
em uma mesa de trabalho. Se você tem um lápis, uma folha e uma borracha, mesmo
uma mesa pequena pode ser suficiente. Mas, se tudo estiver jogado de qualquer
jeito, você perde tempo procurando o que precisa, repete erros e se atrapalha
mais do que deveria. No desenvolvimento acontece algo parecido. Um projeto
pequeno pode ser simples, mas ainda precisa ter uma estrutura lógica. Quando o
código é escrito sem cuidado, até o básico começa a ficar difícil de entender.
É
nesse contexto que entra a ideia de organizar melhor a API, ainda que de forma
inicial. O aluno começa a perceber que existe a parte dos modelos, a parte das
rotas e a parte onde os dados estão sendo manipulados. Mesmo que tudo ainda
esteja no mesmo arquivo, essa separação mental já ajuda bastante. Ela mostra
que um sistema não é apenas um monte de funções soltas, mas um conjunto de
elementos que cumprem papéis diferentes.
Ao mesmo tempo, esta aula apresenta o uso de listas temporárias em memória como forma de simular armazenamento. Isso é extremamente útil no ensino porque permite que o aluno construa uma aplicação que já parece mais viva, sem depender ainda da complexidade de um banco de dados real. Em vez de apenas retornar mensagens fixas ou exemplos
estáticos, a API passa a receber dados,
guardar esses dados temporariamente e listá-los depois. Isso cria uma sensação
muito mais concreta de funcionamento de sistema.
Por
exemplo, quando o aluno cadastra um curso e depois consegue listá-lo em outra
rota, ele percebe que a aplicação está lidando com um fluxo mais próximo do
mundo real. Claro, esse armazenamento ainda é limitado e temporário, mas
pedagogicamente ele cumpre muito bem o papel de ponte entre a API introdutória
e sistemas mais completos. É uma forma de praticar lógica de cadastro e
consulta sem atropelar o processo de aprendizagem com temas mais avançados
antes da hora.
Esse
ponto é importante porque muitos iniciantes cometem dois erros opostos. O
primeiro é querer avançar rápido demais e pular direto para banco de dados,
autenticação, deploy e arquitetura complexa sem dominar o básico. O segundo é
ficar preso em exemplos tão simples que nunca chega a sentir que está
construindo algo mais funcional. O uso de listas temporárias resolve parte
desse problema, porque mantém a simplicidade do estudo, mas já permite ao aluno
enxergar uma API que recebe, armazena e devolve informações.
Na
prática, uma lista em memória funciona como um espaço provisório dentro da
aplicação. Quando o dado é enviado, ele é adicionado à lista. Quando a rota de
consulta é chamada, o sistema mostra o que está armazenado ali. Isso ajuda o
estudante a entender o fluxo básico de manipulação de dados: entrada,
armazenamento e saída. Essa tríade é central em sistemas digitais, e aprender
isso de forma simples é muito mais inteligente do que tentar decorar tecnologia
mais avançada sem compreender a lógica fundamental.
Ao
mesmo tempo, esta aula também ensina uma lição importante sobre limite técnico.
Os dados guardados em memória não permanecem para sempre. Se a aplicação for
reiniciada, tudo o que estava armazenado ali desaparece. Esse detalhe não é um
problema dentro da proposta didática da aula, mas precisa ser compreendido com
clareza. Se o aluno não entende essa limitação, pode criar a falsa impressão de
que já está trabalhando com persistência real de dados. Não está. E é melhor
deixar isso explícito desde já.
Esse tipo de honestidade didática é importante porque evita ilusões. Programação já tem confusão suficiente; não precisa de atalhos mentais errados. Uma lista em memória é uma ferramenta de aprendizagem, não uma solução definitiva para sistemas reais. Ela serve para mostrar a lógica do processo, não para
substituir um banco de dados. Saber essa diferença é parte do amadurecimento do
aluno.
Pense
em uma escola de cursos livres que quer testar uma ideia simples: cadastrar
alguns cursos em uma API e listar esses cursos depois. Em um projeto didático,
usar uma lista em memória faz sentido porque permite validar a lógica sem
aumentar a complexidade logo no começo. O aluno consegue criar um modelo de
curso, enviar dados, adicionar esses dados a uma lista e consultar o que foi
cadastrado. Esse fluxo, embora simples, já ensina bastante. Ensina como a API
recebe objetos, como mantém informações temporariamente e como devolve esses
dados em uma rota de listagem.
Esse
tipo de exercício também ajuda a consolidar o uso do Pydantic e dos métodos
HTTP aprendidos anteriormente. O aluno percebe que os conteúdos não estavam
soltos. O que parecia separado começa a se conectar. O método POST pode ser
usado para adicionar algo à lista. O método GET pode ser usado para listar o
que foi armazenado. O modelo Pydantic continua servindo para validar a
estrutura dos dados recebidos. De repente, a API começa a parecer menos
fragmentada e mais coerente como projeto.
Do
ponto de vista pedagógico, isso é excelente, porque uma das maiores
dificuldades de quem está aprendendo programação é justamente unir as peças.
Muita gente entende um conceito isolado, depois entende outro, mas não consegue
perceber como eles trabalham juntos. Esta aula ajuda a resolver isso. Ela
mostra que rotas, métodos, modelos e armazenamento não são assuntos
independentes, mas partes de um mesmo fluxo.
Também
é nessa etapa que o aluno começa a sentir uma diferença importante entre
escrever código e organizar um pequeno sistema. Escrever código é produzir
instruções. Organizar um sistema é pensar em como essas instruções se
relacionam. Esse salto de mentalidade é valioso. Ele não transforma o iniciante
em especialista, obviamente, mas muda a forma como ele enxerga o que está
construindo. E isso já é um avanço considerável.
Claro que, ao trabalhar com listas temporárias, alguns erros são bastante comuns. Um dos mais frequentes é esquecer que os dados armazenados precisam ser convertidos adequadamente quando necessário. Outro é não perceber que a lista está sendo manipulada apenas enquanto a aplicação está ativa. Também é comum que o iniciante pense que, por ter listado um dado uma vez, esse dado já estará “salvo” permanentemente. Não estará. Além disso, alguns alunos acabam misturando demais a lógica de
cadastro com a lógica de listagem, deixando o
código confuso e pouco legível.
A
melhor maneira de evitar esses problemas é manter uma organização mental
simples. Primeiro, entender qual é a estrutura do dado que será recebido.
Depois, decidir onde esse dado será armazenado temporariamente. Em seguida,
separar claramente a rota que cadastra da rota que lista. Por fim, lembrar
sempre que a memória da aplicação é provisória. Essas quatro ideias já evitam
boa parte da confusão dessa fase.
Outro
ponto que merece destaque é que esta aula também prepara o aluno emocionalmente
para a próxima etapa. Até aqui, ele pode ter pensado que programar APIs é só
responder com mensagens ou receber pequenas entradas. Agora ele começa a ver
algo mais próximo de um sistema utilizável, ainda que em escala reduzida. Isso
costuma gerar uma sensação positiva de evolução. E essa sensação importa,
porque o aprendizado em programação depende muito de perceber progresso real.
Mas
aqui também cabe um alerta. O aluno não deve se iludir achando que, porque
conseguiu usar uma lista em memória, já domina armazenamento de dados. Não
domina. O que ele ganhou foi compreensão da lógica básica, e isso já é muito
valioso. O erro seria subestimar essa etapa ou, no extremo oposto, superestimar
o que ela representa. O uso de listas temporárias é um recurso didático
inteligente porque ensina sem atropelar. E esse equilíbrio faz diferença.
Ao
final desta aula, o estudante deve compreender que organizar melhor o projeto
não significa complicá-lo sem necessidade, mas dar mais clareza ao que está
sendo construído. Também deve entender que listas temporárias em memória são
uma forma útil de simular o armazenamento de dados em uma fase introdutória,
permitindo praticar fluxos reais de cadastro e listagem. E, acima de tudo, deve
perceber que desenvolvimento não é apenas fazer uma rota responder, mas começar
a pensar em como o sistema se estrutura.
Em resumo, esta aula marca uma transição importante. A API deixa de ser apenas um conjunto de exemplos e começa a ganhar comportamento de aplicação. Mesmo sem banco de dados, mesmo sem arquitetura avançada, mesmo ainda dentro de um contexto introdutório, o aluno já passa a experimentar a lógica de um sistema que recebe, guarda temporariamente e exibe informações. É um passo simples, mas muito significativo. E é exatamente esse tipo de passo bem dado que constrói uma base sólida para avançar depois com mais segurança.
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.
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
3 — Miniprojeto final: API básica de catálogo de cursos
Chegar
ao miniprojeto final de um curso introdutório tem um valor que vai além do
conteúdo técnico. Esse momento costuma representar uma virada importante para o
aluno. Até aqui, ele estudou conceitos separados: entendeu o que é uma API,
conheceu o FastAPI, criou rotas simples, trabalhou com parâmetros, recebeu
dados, validou informações e viu como organizar melhor uma aplicação básica.
Tudo isso foi necessário. Mas existe uma diferença grande entre entender partes
isoladas e conseguir enxergar essas partes funcionando juntas em um projeto com
começo, meio e finalidade. É exatamente isso que está aula propõe.
O
miniprojeto final não deve ser visto como algo gigantesco ou sofisticado. E
esse ponto precisa ser dito de forma clara. Muita gente cai no erro de achar
que, para um projeto ter valor, ele precisa parecer complexo, cheio de recursos
e visualmente impressionante. Isso é uma visão infantil sobre desenvolvimento.
Um projeto simples, mas bem compreendido, ensina muito mais do que uma
estrutura grande copiada sem entendimento. O objetivo desta aula não é
impressionar ninguém com complexidade artificial. O objetivo é consolidar a
base construída ao longo do curso por meio de uma aplicação pequena, funcional
e didaticamente coerente.
A
proposta de criar uma API básica de catálogo de cursos faz muito sentido nesse
contexto porque dialoga com uma situação real e próxima do universo do aluno.
Em vez de trabalhar com exemplos soltos ou desconectados, o projeto gira em
torno de algo compreensível: cadastrar cursos, listar cursos, consultar um
curso específico e manter uma rota inicial de apresentação. Isso cria unidade
didática. O estudante deixa de ver os exercícios como blocos independentes e
passa a perceber uma aplicação com propósito.
Esse tipo de projeto ajuda a responder uma pergunta que aparece com frequência no processo de aprendizagem: “Tudo isso que eu estudei serve para quê, na prática?” Serve
exatamente para isso. Serve para construir um sistema, ainda
que simples, com lógica de uso real. Quando o aluno consegue cadastrar um
curso, depois listar esse curso e buscá-lo pelo nome, ele entende que os
conceitos anteriores não eram meros exercícios artificiais. Eles eram peças de
uma estrutura maior.
A
primeira grande contribuição dessa aula é mostrar que um projeto, mesmo
pequeno, precisa de objetivo claro. E aqui o objetivo é bastante direto: montar
uma API capaz de funcionar como um catálogo introdutório de cursos. Isso
significa que haverá uma rota inicial, uma rota para cadastro, uma rota para
listagem e uma rota para busca por nome. Parece pouco, mas já é o suficiente
para dar ao aluno uma visão concreta de fluxo. Existe uma entrada, existe um
armazenamento temporário, existe uma consulta e existe uma resposta organizada.
Isso já coloca o estudante em contato com a lógica fundamental de muitos
sistemas reais.
Um
aspecto importante dessa aula é que ela ajuda o aluno a integrar conhecimentos.
Até então, ele pode ter aprendido os métodos HTTP de maneira separada. Agora
começa a perceber sua aplicação prática dentro de um único projeto. A rota
inicial, normalmente acessada por GET, serve para apresentar a API. A rota de
cadastro, geralmente feita com POST, recebe e organiza os dados do curso. A
rota de listagem, outra vez com GET, permite visualizar o que foi armazenado. A
rota de busca por nome também usa GET, mas com parâmetro de rota, mostrando que
a API pode responder com base no valor enviado pelo usuário. Esse conjunto já
forma um sistema pequeno, mas coerente.
Além
disso, o miniprojeto ajuda a consolidar o uso do Pydantic. O aluno percebe que
não basta receber qualquer dado de qualquer jeito. Para cadastrar um curso, faz
sentido definir uma estrutura com campos como nome, carga horária e descrição.
Quando esses dados são modelados com clareza, a API se torna mais organizada, e
o próprio código ganha mais legibilidade. Isso reforça uma lição importante do
curso: boas aplicações não surgem da improvisação. Elas surgem de estrutura,
clareza e coerência.
Outro ponto muito valioso desta aula é que ela coloca o aluno diante de uma experiência mais próxima do que ele encontrará fora do ambiente de estudo. Ainda não se trata de um sistema completo, com banco de dados, autenticação e múltiplos arquivos organizados em módulos separados. Seria cedo demais para exigir tudo isso. Mas também já não se trata apenas de exemplos desconectados e respostas
muito valioso desta aula é que ela coloca o aluno diante de uma
experiência mais próxima do que ele encontrará fora do ambiente de estudo.
Ainda não se trata de um sistema completo, com banco de dados, autenticação e
múltiplos arquivos organizados em módulos separados. Seria cedo demais para
exigir tudo isso. Mas também já não se trata apenas de exemplos desconectados e
respostas estáticas. O miniprojeto ocupa um espaço intermediário muito
inteligente: é simples o suficiente para ser compreendido por um iniciante, mas
estruturado o bastante para parecer um sistema de verdade.
Do
ponto de vista didático, isso é excelente porque cria uma ponte entre o
aprendizado inicial e os próximos passos. O aluno começa a perceber que sabe
mais do que imaginava. Talvez ele ainda não domine desenvolvimento de APIs em
nível avançado, e isso é normal. Mas já consegue construir um fluxo básico
funcional. E esse reconhecimento tem valor. Não como elogio vazio, mas como
constatação objetiva de progresso.
Quando
o projeto propõe uma API de catálogo de cursos, também ajuda o estudante a
pensar em recursos de uma aplicação com mais intenção. Uma rota inicial, por
exemplo, não existe apenas para “ter alguma coisa na raiz”. Ela cumpre uma
função de apresentação e identificação da API. Isso já ensina que nem toda rota
precisa estar ligada diretamente a um dado; algumas têm função institucional,
informativa ou operacional. Já a rota de cadastro mostra que a aplicação não é
apenas consulta, mas também entrada de dados. A listagem permite observar o
conjunto do que foi armazenado. E a busca por nome introduz uma forma simples
de localizar um item específico. Em conjunto, essas partes se complementam de
maneira bastante didática.
Também
vale destacar que este miniprojeto ajuda o aluno a amadurecer sua forma de
testar. Em vez de verificar uma rota isolada e encerrar ali, ele passa a
observar o comportamento do sistema como um todo. Cadastrou um curso? Ele
aparece na listagem? A busca pelo nome retorna corretamente? O que acontece
quando o curso não existe? Esse tipo de verificação já aproxima o estudante de
uma postura mais analítica. Não basta escrever o código. É preciso observar o
fluxo, testar cenários e interpretar resultados.
E é justamente nesse ponto que começam a surgir erros muito reveladores. Um dos mais comuns é o aluno cadastrar um curso e depois não entender por que ele não aparece corretamente na listagem. Muitas vezes, o problema está na forma como os dados foram
armazenados. Em outros casos, a busca por nome falha porque a
comparação foi feita de maneira sensível a maiúsculas e minúsculas, sem
tratamento adequado. Também é comum que o aluno tente buscar um curso que não
existe e não saiba como a API deve responder nesse caso. Esses erros não são
acidentes irrelevantes. Eles mostram que a aplicação começou a ter
comportamento mais real, e isso exige mais atenção ao raciocínio.
Outro
erro frequente é pensar que o miniprojeto “já está completo demais” e, por
isso, não precisa de organização. É justamente o contrário. Quanto mais
elementos se juntam, mais a clareza se torna necessária. Mesmo em uma aplicação
pequena, é importante manter boa leitura do código, separar bem o papel das
rotas, entender o modelo de dados e evitar misturar tudo de forma caótica. O
aluno não precisa transformar esse projeto em uma arquitetura sofisticada, mas
precisa começar a enxergar que sistema legível é sistema mais fácil de manter.
Há
também um ganho conceitual importante nesta aula: ela ensina que um projeto é,
no fundo, uma combinação de decisões simples bem conectadas. Não existe mágica.
A API funciona porque há uma rota para receber dados, uma estrutura para
validar esses dados, um local temporário para armazená-los e rotas para
consultá-los depois. Quando o aluno entende isso, ele para de enxergar projetos
como algo misterioso ou reservado a pessoas muito avançadas. Ele percebe que um
sistema nasce da união lógica de componentes compreensíveis.
Isso
tem impacto direto na autoconfiança técnica do estudante, mas é importante
tratar essa ideia com honestidade. Autoconfiança útil não é achar que já domina
tudo. É saber exatamente o que consegue fazer e o que ainda não consegue. Ao
concluir este miniprojeto, o aluno não sai pronto para qualquer desafio de
desenvolvimento. Seria ridículo afirmar isso. Mas ele sai com uma base
concreta: consegue estruturar uma API básica, integrar conceitos essenciais e
compreender o fluxo central de um pequeno sistema. Isso já é um avanço real.
Outro ponto didático relevante é que esta aula também ajuda o estudante a perceber os limites da solução atual. O armazenamento ainda é feito em memória, então os dados desaparecem quando a aplicação reinicia. A busca ainda é simples, feita por nome, sem banco de dados nem filtros avançados. O projeto ainda não trata autenticação, controle de acesso ou persistência real. E tudo bem. Reconhecer esses limites não diminui o projeto; pelo contrário, mostra
maturidade. O aluno
precisa entender não apenas o que construiu, mas também o que ainda falta para
transformar essa ideia em uma aplicação mais robusta.
Esse
olhar é importante porque impede dois erros muito comuns. O primeiro é
subestimar o projeto, como se ele fosse “simples demais para valer alguma
coisa”. O segundo é superestimar o projeto, como se ele já representasse um
sistema completo. Os dois extremos atrapalham. O que importa aqui é entender o
lugar pedagógico do miniprojeto: ele é uma síntese introdutória, feita para
consolidar a base e preparar terreno para avanços futuros.
Ao
final desta aula, o mais importante é que o aluno consiga olhar para a API
construída e reconhecer nela uma aplicação pequena, mas coerente. Ele deve
perceber que já consegue criar rotas com funções diferentes, usar métodos HTTP
de forma apropriada, validar dados recebidos, armazenar informações
temporariamente e consultar esses dados depois. Mais do que isso, deve entender
que esses recursos não estão soltos. Eles fazem parte de um mesmo fluxo de
construção.
Em resumo, o miniprojeto final do módulo 3 cumpre um papel decisivo dentro do curso. Ele transforma conteúdos que antes podiam parecer fragmentados em um sistema com sentido prático. Ao fazer isso, mostra ao aluno que aprender FastAPI não é decorar comandos, mas compreender como diferentes elementos se conectam para formar uma aplicação funcional. Essa compreensão é o que realmente importa. Porque, a partir dela, o estudante deixa de apenas repetir exemplos e começa, de fato, a construir.
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.
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.
Estudo de caso do Módulo 3 — Quando a API deixa de ser
exercício e começa a parecer sistema
No início do Módulo 3, Rafael já estava mais confiante do que no começo do curso. Ele tinha passado pela fase de instalar ambiente, criar rotas simples, entender parâmetros, usar query parameters e receber dados com validação. Pela primeira vez, sentia que não estava mais apenas repetindo exemplos. Agora conseguia
olhar para uma rota e entender, pelo menos em parte, o que ela fazia.
E
foi exatamente aí que o próximo problema apareceu.
A
confiança dele começou a virar excesso de confiança.
Rafael
decidiu montar a API de catálogo de cursos proposta no módulo. A ideia parecia
simples: criar uma rota inicial, cadastrar cursos, listar cursos e buscar um
curso pelo nome. Na cabeça dele, isso seria apenas “juntar as partes”. Mas a
verdade é que juntar as partes é justamente o momento em que os erros ficam
mais interessantes. Quando o conteúdo está separado, o aluno acha que entende.
Quando precisa integrar tudo, descobre onde realmente estão os furos.
Ele
começou criando a rota inicial com GET, e isso funcionou sem dificuldade.
Depois fez a rota para listar cursos, também com GET. Até aí, tudo parecia
tranquilo. O problema começou quando foi criar a rota de cadastro. Em vez de
pensar com calma sobre a diferença entre listar, criar, atualizar e excluir,
Rafael começou a usar os métodos HTTP meio no improviso. Em alguns testes,
colocou cadastro com GET só porque era o método que já estava acostumado a
usar. Em outros, colocou consulta com POST sem necessidade.
Esse
é um erro clássico do Módulo 3: o aluno aprende os nomes dos métodos HTTP, mas
não internaliza a lógica deles. A API até pode parecer funcionar de algum
jeito, mas a estrutura fica ruim. E estrutura ruim cobra preço depois. GET é
para buscar. POST é para criar. PUT é para atualizar. DELETE é para remover.
Quando a pessoa não respeita isso, transforma a API em uma bagunça sem padrão.
Depois
de ajustar isso, Rafael foi para a parte do cadastro com Pydantic. Criou um
modelo de curso com nome, carga horária e descrição. Até aqui, tudo certo. O
problema surgiu quando ele tentou armazenar os dados em uma lista temporária.
Ele recebia o objeto validado, mas não pensou direito em como esse dado seria
manipulado depois. Em alguns momentos, guardava o objeto de um jeito; em
outros, tentava acessar como se fosse dicionário comum. O código começou a
funcionar em uma rota e falhar em outra.
Esse
erro é mais importante do que parece. Ele mostra que o aluno entendeu a entrada
de dados, mas ainda não entendeu bem a consistência do armazenamento. Não basta
receber corretamente. Também é preciso manter uma lógica clara de como aquilo
será guardado e consultado. Quando isso não é pensado, a API fica instável: um
pedaço do sistema trata o dado de um jeito, outro pedaço trata de outro.
Na sequência, Rafael cadastrou dois
cursos e foi para a rota de listagem.
Funcionou. Isso deu uma falsa sensação de domínio. Ele achou que o projeto
estava praticamente pronto. Só que, quando testou a busca por nome, a API
começou a falhar em situações simples. Se buscava exatamente com a mesma
grafia, às vezes encontrava. Se mudava maiúscula para minúscula, já não
encontrava mais. Se colocava um espaço extra ou um nome levemente diferente, a
busca falhava sem qualquer cuidado.
Aqui
apareceu outro erro muito comum: fazer busca literal sem pensar na experiência
da consulta. Em teoria, o código estava “certo” porque comparava o valor
informado com o valor armazenado. Mas, na prática, a lógica estava fraca.
Sistemas reais precisam lidar minimamente com variações simples, como diferença
entre maiúsculas e minúsculas. Quando o aluno não pensa nisso, constrói algo
tecnicamente executável, mas pobre em funcionamento.
Rafael
corrigiu isso parcialmente, ajustando a comparação para ignorar letras
maiúsculas e minúsculas. Melhorou. Só que, logo depois, surgiu outro problema.
Quando um curso não era encontrado, a API devolvia respostas improvisadas, sem
padrão. Em uma tentativa, retornava uma string solta. Em outra, uma mensagem
diferente. Em outra, simplesmente quebrava o fluxo. Isso mostrava falta de
consistência na forma de responder.
Esse
é outro ponto em que iniciantes tropeçam: sabem pensar no cenário de sucesso,
mas não pensam no cenário de falha. Só que sistema de verdade não é feito
apenas do caso ideal. Ele também precisa saber responder quando algo não
existe, quando algo dá errado ou quando a entrada não corresponde ao esperado.
Ignorar isso é programar pela metade.
Mais
adiante, Rafael resolveu tentar atualizar cursos. E aí confundiu criação com
atualização. Em vez de usar PUT para alterar um item existente, começou a
cadastrar de novo o mesmo curso modificado, como se criar outra entrada
resolvesse o problema. Isso gerou duplicidade na lista e bagunçou a lógica da
aplicação. Ele não estava atualizando um curso; estava empilhando versões
diferentes do mesmo curso.
Esse
erro mostra uma falha conceitual importante: não entender que operações
diferentes produzem efeitos diferentes sobre os dados. Criar não é atualizar.
Atualizar não é remover. Quando o aluno trata tudo como “enviar dados para a
API”, ele perde a lógica do sistema. E sem lógica, o projeto vira um conjunto
de remendos.
Quando foi implementar exclusão, a situação ficou ainda mais clara. Rafael queria remover um curso pelo
nome, mas não pensou no que aconteceria se o curso não
existisse. Também não refletiu sobre o que ocorreria se houvesse nomes
duplicados na lista. Acabou escrevendo uma lógica apressada, que removia de
forma frágil e sem muita previsibilidade. Funcionava em um teste simples, mas
era fácil perceber que o comportamento não estava bem pensado.
Esse
tipo de problema ensina uma lição dura, mas necessária: quando a API começa a
parecer sistema, os erros deixam de ser só erros de sintaxe e passam a ser
erros de modelagem e raciocínio. O código pode rodar e, ainda assim, a lógica
pode estar ruim. E lógica ruim é pior do que sintaxe errada, porque engana. O
erro de sintaxe aparece na hora. O erro de lógica às vezes só aparece quando
você testa melhor.
No
meio de tudo isso, Rafael também esbarrou em outra limitação importante: os
dados desapareciam quando reiniciava a aplicação. Na primeira vez em que isso
aconteceu, ele estranhou e achou que tinha “perdido tudo”. Na verdade, ele só
não tinha internalizado o que a aula explicava: listas em memória são
temporárias. Elas servem para simular armazenamento, não para persistir dados
de verdade. Esse ponto é básico, mas muita gente ignora porque fica empolgada
demais ao ver a API funcionando.
A
consequência desse erro não é só técnica. É mental. O aluno começa a
superestimar o que construiu. E isso atrapalha, porque cria a ilusão de que já
está trabalhando com um sistema completo, quando ainda está em uma etapa
introdutória. O mais inteligente é reconhecer os limites do que foi feito. A
lista em memória é útil para aprender fluxo. Só isso. Não substitui banco de
dados.
Depois
de quebrar a cabeça com tudo isso, Rafael percebeu que o maior desafio do
Módulo 3 não era escrever mais código. Era pensar melhor. Pensar no papel dos
métodos HTTP. Pensar em como os dados são armazenados. Pensar em como a busca
funciona. Pensar em como o sistema responde quando algo não é encontrado.
Pensar na diferença entre uma solução didática e uma solução real.
Foi
nesse momento que o módulo começou a fazer sentido de verdade.
Erros
comuns mostrados no caso e como evitá-los
O
primeiro erro foi usar métodos HTTP sem critério.
Muita gente usa GET, POST, PUT e DELETE como se fossem apenas rótulos
decorativos. Não são. A forma de evitar isso é perguntar com clareza: essa rota
vai buscar, criar, atualizar ou remover? A resposta define o método.
O
segundo erro foi não manter consistência na forma de armazenar dados.
Se você recebe um objeto
validado, precisa decidir como esse dado será guardado
e como será acessado depois. Misturar formas de tratamento só cria confusão. O
ideal é manter um padrão claro desde o início.
O
terceiro erro foi achar que listar dados funcionando significa que o projeto
inteiro está resolvido.
Listagem é só uma parte. O sistema precisa ser testado como fluxo completo:
cadastro, listagem, busca, atualização e remoção. Testar um pedaço só e assumir
que o resto está certo é ingenuidade.
O
quarto erro foi fazer busca frágil, sensível a variações simples.
Comparações literais demais costumam gerar comportamento ruim. Uma forma básica
de evitar isso é normalizar os valores, por exemplo, comparando tudo em letras
minúsculas.
O
quinto erro foi não pensar em cenários de falha.
Não basta programar o caso em que tudo dá certo. É preciso decidir o que a API
fará quando o dado não existir, quando houver duplicidade ou quando a entrada
não corresponder ao esperado.
O
sexto erro foi confundir criação com atualização.
Criar um registro não substitui atualizar um registro existente. Para evitar
isso, o aluno precisa entender o ciclo de vida do dado: quando algo nasce,
quando é alterado e quando deixa de existir.
O
sétimo erro foi implementar exclusão sem pensar nas consequências.
Remover “o primeiro que encontrar” pode parecer suficiente, mas às vezes não é.
É preciso pelo menos refletir sobre nomes duplicados, ausência do item e
previsibilidade da resposta.
O
oitavo erro foi esquecer que listas em memória são temporárias.
Isso se evita com honestidade técnica. O aluno precisa repetir para si mesmo:
memória não é persistência. Reiniciou a aplicação, perdeu os dados. Esse
recurso é didático, não definitivo.
O
que esse estudo de caso realmente mostra
O
Módulo 3 parece simples porque o projeto é pequeno. Mas isso engana. O que ele
cobra do aluno não é volume de código. É integração de raciocínio. Agora já não
basta entender uma rota isolada ou um conceito separado. É preciso conectar
tudo com coerência.
Essa
é a diferença entre fazer exercício e começar a montar sistema.
Rafael
só começou a evoluir de verdade quando parou de perguntar “qual código eu
coloco aqui?” e passou a perguntar “qual comportamento faz sentido para essa
API?”. Essa mudança é o centro do módulo. E, sinceramente, é aí que muita gente
se separa: quem continua copiando pedaços sem pensar, trava; quem aprende a
organizar o raciocínio, avança.
No fim, o miniprojeto de catálogo de cursos não era só uma
atividade final. Era um teste de maturidade básica. Não para medir genialidade, mas para verificar se o aluno já consegue transformar conceitos em um fluxo coerente. E esse tipo de competência vale muito mais do que decorar meia dúzia de exemplos.
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