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