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

  1. 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 version

  2. Criaçã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.

    commands
    mkdir api-rest-go
    cd api-rest-go
    go mod init api-rest-go

  3. Instalaçã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.

    commands
    go get -u github.com/gin-gonic/gin
    go get -u gorm.io/gorm
    go get -u gorm.io/driver/sqlite

  4. Configuraçã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.go
    package 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")
        }
    }

  5. Criação do Modelo `Produto`

    Crie um novo arquivo chamado `product.go` e defina a estrutura do modelo de dados `Produto`.

    product.go
    package main
    
    import "gorm.io/gorm"
    
    type Produto struct {
        gorm.Model
        Nome  string  `json:"nome"`
        Preco float64 `json:"preco"`
    }

  6. 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.go
    package 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)
        }
    }

  7. 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.go
    package 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

  8. 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 test

    curl_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.

Hashtags

#Go #Gin #GORM #APIs #DesenvolvimentoDeSoftware