Portal IDEA

Básico de FastAPI

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.

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