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.

O que mudou?

Para entender melhor as mudanças, vamos começar com um exemplo simples. Nele, nossa função irá atender somente requisições do tipo GET. Caso contrário, retornamos um erro 405.

package main

import (
    "fmt"
    "net/http"
)

func main() {
    mux := http.NewServeMux()
    
    mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
        if r.Method == http.MethodGet {
            fmt.Fprintln(w, "Hello, World!")
        } else {
            http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
        }
    })
    
    http.ListenAndServe(":8080", mux)
}

Agora, abaixo, note que ao invés de validar o tipo da requisição dentro da função, adicionamos um GET antes de declarar o path. Assim, o próprio router do Go irá fazer o filtro das requisições encaminhadas para essa rota.

package main

import (
    "fmt"
    "net/http"
)

func main() {
    mux := http.NewServeMux()

    mux.HandleFunc("GET /hello", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, World!")
    })

    http.ListenAndServe(":8080", mux)
}

Por padrão, caso a combinação de rota + tipo de request não seja satisfeita, o próprio router do Go irá retornar um erro 405.

Parâmetros

O exemplo acima já é uma grande evolução, porém, as mudanças do Go 1.22 não param por aí. Outra funcionalidade muito desejada e que agora também está disponível, é a capacidade de passar parâmetros nas rotas.

package main

import (
    "fmt"
    "net/http"
)

func main() {
    mux := http.NewServeMux()

    mux.HandleFunc("GET /hello/{name}", func(w http.ResponseWriter, r *http.Request) {
        var name := r.PathValue("name")
        fmt.Fprintln(w, "Hello, " + name + "!")
    })

    http.ListenAndServe(":8080", mux)
}

Embora o exemplo acima consiga dar match com a rota /hello/Tiago+Temporin, ela com certeza falharia para a rota /hello/a/b/c.jpg. Para casos onde todo o restante da URL precise ser passado para o parâmetro, adicione ... ao nome.

mux.HandleFunc("GET /resource/{filepath...}", func(w http.ResponseWriter, r *http.Request) {
    var name := r.PathValue("filepath")
    // code
})

No exemplo acima, o valor de filepath para a chamada /resource/a/b/c.jpg seria a/b/c.jpg.

Por fim, mas não menos importantes, para rotas que terminem em /, como por exemplo /posts/, é preciso adicionar um {$} à declaração da rota.

mux.HandleFunc("GET /posts/{$}", func(w http.ResponseWriter, r *http.Request) {
    // code
})

O exemplo acima dá match com a request /posts/ mas falha com a request /posts.

Precedência das Rotas

A precedência das rotas no net/http segue uma lógica de correspondência específica. Rotas mais específicas têm prioridade sobre rotas mais genéricas. Por exemplo, se houver uma rota /post/{id} e uma rota /post/latest, a rota /post/latest será correspondida primeiro quando o caminho exato for solicitado.

Conclusão

As melhorias recentes no roteamento do net/http tornam o package em uma ferramenta ainda mais poderosa e flexível para o desenvolvimento de aplicações web.

Comparado ao go-chi, o novo roteador do net/http oferece uma abordagem mais integrada, reduzindo a necessidade de dependências externas. No entanto, go-chi ainda oferece funcionalidades avançadas, como middlewares e roteamento aninhado, que podem ser preferíveis em aplicações mais complexas.

Em resumo, as novas funcionalidades de roteamento no net/http são um grande passo à frente, tornando o desenvolvimento de aplicações web mais simples e eficiente. Para projetos que necessitam de mais controle e funcionalidades adicionais, go-chi – que é o package utilizado nas Imersões Aprenda Golang – continua sendo uma excelente escolha.


Faça parte da comunidade!

Receba os melhores conteúdos sobre Go, Kubernetes, arquitetura de software, Cloud e esteja sempre atualizado com as tendências e práticas do mercado.

Livros Recomendados

Abaixo listei alguns dos melhores livros que já li sobre GO.

Deixe uma resposta