Pular para o conteúdo principal

victorstein.dev

43/100 Dias de Golang - Webservers com Gin

Table of Contents

# Webservers com Gin

Golang tem vários frameworks web como Fiber, Echo, Iris, Chi, Http Router, Beego, mas o que escolhi para falar aqui foi o Gin. Gostei dos exemplos, da documentação e de como ele parece fácil de usar. Vamos estruturar uma aplicação bem simples com ele! A instalação deve ser feita com go get -u github.com/gin-gonic/gin

# Retornando um JSON

Assim como no exemplo do dia 42, vamos retornar um JSON. Veja a simplicidade do uso do Gin!

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()

	r.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "Olá Mundo!",
		})
	})

	r.Run()
}

A porta padrão do Gin é a 8080. Outra coisa bem legal é que no terminal temos mais informações para ajudar no debug.

Saída do terminal da execução do Gin

Veja como fica uma rota para capturar um parâmetro do path:

r.GET("/user/:name", func(c *gin.Context) {
		name := c.Param("name")
		c.JSON(200, gin.H{
			"user": name,
		})
	})

Vamos criar um exemplo com um banco de dados na memória, para cadastrar, buscar e listar dados de um usuário. Vamos criar uma struct e um map de dados para simular o banco de dados.

type User struct {
    ID        string `json:"id"`
    Name      string `json:"name" binding:"required,min=3"`
    Email     string `json:"email" binding:"required,email"`
    Age       int    `json:"age" binding:"required,gte=18"`
}

var users = make(map[string]User)

Agora vamos fazer as 3 funções:

Buscar usuários

func getUser(c *gin.Context) {
    id := c.Param("id")

    user, exists := users[id]
    if !exists {
        c.JSON(http.StatusNotFound, gin.H{
            "error": "User not found",
        })
        return
    }

    c.JSON(http.StatusOK, user)
}

Listar usuários

func listUsers(c *gin.Context) {
    userList := make([]User, 0, len(users))
    for _, user := range users {
        userList = append(userList, user)
    }

    c.JSON(http.StatusOK, gin.H{
        "users": userList,
    })
}

Criar usuários

func createUser(c *gin.Context) {
    var newUser User

    if err := c.ShouldBindJSON(&newUser); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    newUser.ID = "user-" + newUser.Name

    users[newUser.ID] = newUser

    c.JSON(http.StatusCreated, gin.H{
        "message": "User created successfully",
        "user":    newUser,
    })
}

E vamos agrupar as rotas, veja que aqui criamos um Group:

api := r.Group("/api")
{
    api.POST("/users", createUser)

    api.GET("/users", listUsers)

    api.GET("/users/:id", getUser)
}

Agora é só executar.

Vou deixar um curl para criar um usuário:

curl -X POST http://localhost:8080/api/users -H "Content-Type: application/json" -d '{
    "name": "Victor",
    "email": "victor@stein.dev",
    "age": 28
}'

Para acessar a rota de listagem de usuários:

curl http://localhost:8080/api/users

Para buscar um usuário específico:

curl http://localhost:8080/api/users/user-Victor