Introdução
Neste tutorial, você aprenderá como desenvolver APIs RESTful utilizando Go, um dos linguagens de programação mais populares atualmente. Focaremos em duas ferramentas poderosas: Gin, um framework web minimalista, e GORM, um ORM (Object-Relational Mapping) para interagir facilmente com bancos de dados. Através deste guia, você será guiado desde a configuração do ambiente de desenvolvimento até a implementação de uma API funcional com todas as operações CRUD. Além disso, também abordaremos boas práticas de projeto e a realização de testes para garantir que sua API esteja robusta e confiável. Ao final, você será capaz de construir suas próprias APIs RESTful de forma eficiente e produtiva.
Etapas
Configuração do Ambiente de Desenvolvimento
Certifique-se de que você tem o Go instalado em sua máquina. Verifique a versão instalada usando o comando `go version`. Se não tiver o Go instalado, acesse o site oficial e siga as instruções para instalação.
commands# Verificar versão do Go
go versionCriação do Projeto Go
Crie um novo diretório para o seu projeto e inicialize um novo módulo Go. Isso gerenciará suas dependências. Use os comandos abaixo no terminal para criar e configurar seu projeto.
commandsmkdir api-rest-go
cd api-rest-go
go mod init api-rest-goInstalação das Dependências Gin e GORM
Instale o Gin para manipulação de rotas e o GORM para interação com o banco de dados. Execute os comandos abaixo para adicionar as dependências ao seu projeto.
commandsgo get -u github.com/gin-gonic/gin
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqliteConfiguração do Banco de Dados
Neste exemplo, utilizaremos o SQLite como nosso banco de dados. Crie um arquivo chamado `database.go` para gerenciar a conexão do banco de dados com GORM.
database.gopackage main import ( "gorm.io/driver/sqlite" "gorm.io/gorm" ) var ( DB *gorm.DB ) func ConnectDatabase() { var err error DB, err = gorm.Open(sqlite.Open("products.db"), &gorm.Config{}) if err != nil { panic("Failed to connect to database") } }
Criação do Modelo `Produto`
Crie um novo arquivo chamado `product.go` e defina a estrutura do modelo de dados `Produto`.
product.gopackage main import "gorm.io/gorm" type Produto struct { gorm.Model Nome string `json:"nome"` Preco float64 `json:"preco"` }
Implementação das Operações CRUD
Crie o arquivo `main.go` com rotas para operações CRUD. O código abaixo define as rotas e funções correspondentes.
main.gopackage main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { router := gin.Default() ConnectDatabase() router.GET("/produtos", getProdutos) router.POST("/produtos", createProduto) router.GET("/produtos/:id", getProduto) router.PUT("/produtos/:id", updateProduto) router.DELETE("/produtos/:id", deleteProduto) router.Run(':8080') } func getProdutos(c *gin.Context) { var produtos []Produto DB.Find(&produtos) c.JSON(http.StatusOK, produtos) } func createProduto(c *gin.Context) { var produto Produto if err := c.ShouldBindJSON(&produto); err == nil { DB.Create(&produto) c.JSON(http.StatusCreated, produto) } else { c.JSON(http.StatusBadRequest, err) } } func getProduto(c *gin.Context) { var produto Produto id := c.Param("id") if err := DB.First(&produto, id).Error; err != nil { c.JSON(http.StatusNotFound, nil) } else { c.JSON(http.StatusOK, produto) } } func updateProduto(c *gin.Context) { var produto Produto id := c.Param("id") if err := DB.First(&produto, id).Error; err != nil { c.JSON(http.StatusNotFound, nil) return } c.ShouldBindJSON(&produto) DB.Save(&produto) c.JSON(http.StatusOK, produto) } func deleteProduto(c *gin.Context) { id := c.Param("id") if err := DB.Delete(&Produto{}, id).Error; err != nil { c.JSON(http.StatusNotFound, nil) } else { c.Status(http.StatusNoContent) } }
Testes Unitários
Implemente os testes unitários para suas funções CRUD. Crie um arquivo chamado `main_test.go` com os testes para validar a lógica da API.
main_test.gopackage main import ( "github.com/gin-gonic/gin" "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" ) func TestGetProdutos(t *testing.T) { router := gin.Default() router.GET("/produtos", getProdutos) req, _ := http.NewRequest("GET", "/produtos", nil) w := httptest.NewRecorder() router.ServeHTTP(w, req) assert.Equal(t, 200, w.Code) } // Implemente outros testes para createProduto, getProduto, updateProduto e deleteProduto
Executando a Aplicação e Testes
Compile e execute sua aplicação usando o comando abaixo. Para testar a API, você pode usar ferramentas como Postman ou cURL para interagir com os endpoints.
commands# Executar a aplicação
go run .
# Executar os testes unitários
go testcurl_examples# Listar todos os produtos
curl -X GET http://localhost:8080/produtos
# Criar um novo produto
curl -X POST -H "Content-Type: application/json" -d '{"nome":"Novo Produto", "preco":99.99}' http://localhost:8080/produtos
Conclusão
Neste tutorial, você aprendeu a criar uma API RESTful completa em Go utilizando Gin e GORM. Desde a configuração do ambiente, passando por operações CRUD até a implementação de testes, você agora possui uma fundação sólida para desenvolver suas próprias APIs. Experimentar, modificar e expandir este projeto é uma excelente forma de aprimorar suas habilidades em Go. Com a flexibilidade e eficiência oferecidas por Gin e GORM, o desenvolvimento de APIs se torna uma tarefa mais simples e robusta.