Implementando uma API com Fiber

Embora eu não tenha dito no post anterior, semana passada iniciamos uma nova série aqui no blog onde vamos implementar uma API bem simples em alguns frameworks web.

Dando continuidade a essa série, hoje vamos implementar uma API utilizando o Fiber, um framework inspirado no Express do Node e que trabalha com Fasthttp ao invés do net/http.

Como podemos ver no gráfico abaixo, uma de suas características mais marcantes é a performance.

Essa performance toda vem da base na qual ele é implementado, pois o Fasthttp tem uma performance muito superior ao net/http quando confrontado com uma quantidade grande de requisições por segundo. Como a própria documentação do Fasthttp diz, para poucas requisições os ganhos são praticamente imperceptíveis.

Tendo dito tudo isso, vamos começar implementação da nossa API instalando a nossa principal dependência.

$ go get github.com/gofiber/fiber/v2

Feito isso, vamos criar uma função para retornar o famoso Hello World!.

func HelloHandler(c *fiber.Ctx) error {
    return c.SendString("Hello, World!")
}

Agora vamos escrever nossa função principal do programa, ou seja, nossa função main.

func main() {
    app := fiber.New()

    app.Get("/", HelloHandler)

    app.Listen(":3000")
}

Para levantar nossa API é só executar um go run main.go e depois um curl http://localhost:3000 para testar.

Se você já utilizou outros frameworks ou pelo menos viu nosso post sobre como implementar API com gorilla/mux, você deve ter notado que, quando a API feita com fiber está pronta para receber requisições, o próprio framework exibe algumas informações no terminal.

exemplo fiber

Outra diferença que podemos ver nessa implementação básica, é que ao definir uma rota, nós também já definimos qual o tipo de requisição que a rota vai aceitar.

Seguindo na mesma linha do que fizemos com gorilla/mux, vamos modificar um pouco nossa rota para ela aceitar um parâmetro, para que possamos retornar Hello NOME ou invés de só Hello World.

Para passar um parâmetro na URL, tudo que precisamos fazer é adicionar um : seguido do nome do parâmetro.

app.Get("/:name", HelloHandler)

Já na nossa função HelloHandler vamos usar o método .Params do fiber.Ctx para recuperar o valor passado na URL.

return c.SendString(fmt.Sprintf("Hello, %s!", c.Params("name")))

Para testar, é só subir a API com o go run e depois executar um curl http://localhost:3000/Tiago.

Em ambos os testes que fizemos, a requisição obteve um texto como resposta. Para que a resposta seja um JSON, precisamos fazer a seguinte mudança na função HelloHandler.

return c.JSON(fiber.Map{
    "message": fmt.Sprintf("Hello, %s!", c.Params("name")),
})

O método JSON, além de já setar o header da resposta como application/json, aceita uma interface{}, ou seja, você pode passar uma struct para ele e a conversão será feita automágicamente para JSON.

Para finalizar, vamos adicionar um endpoint para receber um POST com um JSON.

Antes de escrever a função, vamos adicionar um struct para facilitar nosso decode.

type Person struct {
    Name string `json:"name"`
    Age  uint8  `json:"age"`
}

Agora vamos adicionar a função PersonHandler.

func PersonHandler(c *fiber.Ctx) error {
    var p Person
    if err := c.BodyParser(&p); err != nil {
        return err
    }

    return c.SendString(fmt.Sprintf("Nome: %s - Idade: %d\n", p.Name, p.Age))
}

Por último, em nossa função principal, vamos adicionar uma rota para atender requisições do tipo POST.

func main() {
    app := fiber.New()

    app.Get("/:name", HelloHandler)
    app.Post("/person", PersonHandler)

    app.Listen(":3000")
}

Para testar, precisamos subir a API com o go run main.go e executar o comando abaixo:

$ curl -X POST http://localhost:3000/person -H "Content-Type: application/json" -d '{"name": "Tiago Temporin", "age": 31}'

Você deve receber uma resposta similar à Nome: Tiago Temporin - Idade: 31.

Deixem suas dúvidas nos comentários.

Até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go.

Deixe uma resposta