Aula 10 - Construindo APIs REST 🏗️
Objetivo
Objetivo: Aplicar os conceitos de REST em Go, organizar o projeto em camadas (MVC adaptado) e entender o roteamento de recursos.
1. Organização em Camadas 🏛️
Para projetos reais, colocar tudo no main.go é inviável. Seguimos uma separação de responsabilidades:
- Handlers (Controller): Lida com a entrada HTTP e resposta.
- Services (Business Logic): Onde as regras de negócio vivem.
- Models (Data Objects): Define a estrutura dos dados.
- Repository (Data Access): Lida com o banco de dados.
2. Modelando nossa API de Produtos 📦
Vamos criar uma API para um catálogo:
type Produto struct {
ID int `json:"id"`
Nome string `json:"nome"`
Preco float64 `json:"preco"`
}
var produtos []Produto // Simulação de banco de dados
3. Implementando os Verbos HTTP 🎬
Listar (GET)
Criar (POST)
func CriarProduto(w http.ResponseWriter, r *http.Request) {
var p Produto
json.NewDecoder(r.Body).Decode(&p)
produtos = append(produtos, p)
w.WriteHeader(http.StatusCreated)
}
4. Estrutura de Pastas Profissional 📂
$ tree
.
├── main.go
├── handlers/
│ └── product_handler.go
├── services/
│ └── product_service.go
├── models/
│ └── product.go
└── go.mod
5. Hierarquia de Chamadas (Mermaid) 📊
graph TD
User((Usuário)) -->|JSON| Handler[Handler/Controller]
Handler -->|Valida| Service[Service/Business]
Service -->|Salva| Repo[Repository/DB]
Repo -->|Retorna| Service
Service -->|Retorna| Handler
Handler -->|Status 201| User
6. Mini-Projeto: API de Livros 🚀
Crie uma API básica que utilize net/http para:
1. Listar livros.
2. Adicionar um novo livro via POST.
3. Organize o código em ao menos dois pacotes diferentes (ex: main e models).
7. Exercícios de Fixação 🧠
- Por que a separação por camadas é importante para testes automatizados?
- Como você retornaria um erro
404se um produto não fosse encontrado? - Qual a diferença entre
json.NewDecoderejson.Unmarshalno contexto de uma requisição HTTP?
Próxima Aula: Vamos acelerar o desenvolvimento com o Framework Gin! 🚀🐹