Como criar rotas no Go 1.22+

O package net/http é uma ferramenta essencial para o desenvolvimento de aplicações web. Originalmente, o roteamento no net/http era bastante básico, exigindo que os desenvolvedores criassem suas próprias soluções para mapear URLs a handlers específicos. Isso frequentemente resultava em código adicional para lidar com casos comuns, como métodos HTTP diferentes (GET, POST, DELETE) e a organização de rotas mais complexas.

Melhorias no Roteamento

Recentemente, na versão 1.22 da linguagem, o time de desenvolvimento do Go introduziu melhorias significativas no roteamento do net/http. Estas mudanças têm como objetivo simplificar o desenvolvimento de aplicações web, oferecendo uma API mais poderosa e flexível para definir e gerenciar rotas.

Leia mais »
package html/template

Como renderizar templates HTML em Go

Dando continuidade ao post sobre como criar websites em Go, vamos nos aprofundar um pouco mais no package html/template, ou seja, vamos ver como renderizar variáveis, criar condicionais e loop dentro de um template HTML.

Variáveis

No package html/template, as variáveis permitem injetar conteúdo dinâmico nos seus templates HTML.

Um variável é identificada no template por {{.NomeDaVariavel}}. Por exemplo:

<title>{{.Titulo}}</title>
Leia mais »

Como criar um website com Golang

A linguagem Go é sem dúvidas uma das linguagens mais versáteis que temos nos dias de hoje. Embora algumas pessoas tenham a idéia que ela só serve para desenvolvimento de APIs, nesse post vou mostrar para vocês, como podemos utilizá-la para criar um website.

Servidor

Assim como quando desenvolvemos uma API, o primeiro passo para o desenvolvimento de um website em Go é criar um servidor utilizando o package net/http.

Leia mais »

Como implementar mTLS em aplicações Go

Hoje vamos explorar como implementar o mTLS (Mutual TLS), que é uma técnica de segurança para autenticação mútua entre cliente e servidor, em uma aplicação Go.

Mas antes de começar, vamos entender um pouco melhor o que é TLS (Transport Layer Security) e qual sua diferença com mTLS.

TLS vs mTLS

O TLS é usado para criptografar a comunicação entre cliente e servidor. Nele, comumente usado em conexões HTTPS, apenas o servidor se autentica perante o cliente, usando um certificado digital para garantir que o cliente está se comunicando com o servidor correto.

Leia mais »

Como utilizar o framework Echo

Mesmo sem saber ainda se será uma série ou não, nesse post, trago uma visão geral sobre um dos frameworks mais populares do mundo Go, o Echo.

Em sua documentação, o framework Echo se autodenomina como de alta performance, extensível e minimalista. Além dessas características, podemos dizer também que é de fácil implementação. Veja o exemplo abaixo.

package main

import (
    "net/http"
    
    "github.com/labstack/echo/v4"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    e.Logger.Fatal(e.Start(":1323"))
}
Leia mais »

Como fazer graceful shutdown correto em um server HTTP

Embora esse tema não seja abordado em exemplos simples de APIs, ele é muito importante. Encerrar um servidor HTTP de forma abrupta, acaba por fechar todas as conexões que ele tem abertas da mesma forma. Em outras palavras, não tratar desligamentos via SIGINT ou SIGTERM de uma API, pode acabar gerando grandes problemas.

Para evitar tais problemas, vou mostrar nesse post como tratar tais sinais e fazer um graceful shutdown do seu servidor HTTP.

Servidor HTTP

Para começar, vamos escrever uma rota que retornará um “hello world”. Vou utilizar o package go-chi para definir a rota não por ser necessário, mas para facilitar o entendimento em aplicações do mundo real.

r := chi.NewRouter()

r.Get("/", func(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello World"))
})
Leia mais »
squirrel eating cone in forest

Como fazer fuzz test em requests HTTP (parte 1)

Na edição de 2022 da GopherCon Brasil, tive o prazer de palestrar sobre Fuzz Test. Foi muito bacana, pois durante a palestra, assim como nos corredores do evento, fizeram vários questionamentos que eu ainda não tinha feito sobre essa feature do Go.

Se você ainda não conhece esse tipo de teste, convido você a ler um post que publicamos aqui no blog (link para o post) onde explicamos melhor o assunto.

O que vou tratar nesse post é o resultado das perguntas feitas no evento mais um link que o Ricardo Maricato me enviou.

Para ver uma das formas de implementar o Fuzz Test para requests HTTP, vamos implementar um endpoint para validação dos dados de uma pessoa.

Vamos começar criando uma struct com um método de validação, e algumas variáveis para armazenar os erros de validação que podemos ter.

Leia mais »
view of landslide

Como reutilizar o response body de uma request HTTP

Algumas semanas atrás, enquanto eu estava desenvolvendo um web crawler junto com um dos alunos de mentoria aqui do Aprenda Golang, nos deparamos com um problema onde precisávamos fazer o parse do resp.Body duas vezes, sendo a primeira para salvar o body no banco de dados e a segunda para extrair os links do página.

Para ficar mais claro, vamos ver o código abaixo.

// Executa a request
resp, err := http.Get(website)
if err != nil {
	log.Println("ERROR:", err)
	return
}
defer resp.Body.Close()

// Extrai conteúdo para salvar no banco de dados
content, err := ioutil.ReadAll(resp.Body)
if err != nil {
	panic(err)
}

// Retorna uma struct para extrair os links sem regex
body, err := html.Parse(resp.Body)
if err != nil {
	panic(err)
}
Leia mais »