Criar um servidor HTTP em Golang do zero
Golang já vem com um servidor HTTP robusto, potente e preparado para produção. Além disso, é muito fácil de usar e não por isso deixa de ser versátil e configurável até o mínimo detalhe.
O pacote http contém um objeto Server com tudo o que precisamos. O mínimo essencial que ele precisa para iniciar são os atributos Addr e Handler.
Addr
Addr é o endereço no qual vai escutar, é uma string com a forma <ip>:<porta>. Por exemplo, se quisermos receber requisições de qualquer computador da rede pela porta 8080, podemos colocar :8080 ou 0.0.0.0:8080. Se estivéssemos desenvolvendo, poderíamos usar 127.0.0.1:8080 para que apenas nosso computador possa acessar (muito útil no Mac para evitar que o aviso do firewall apareça constantemente).
Handler
Handler é uma função que será invocada cada vez que o servidor receber uma requisição HTTP. Esta função dispõe de um ResponseWriter para enviar nossa resposta e de um Request para ler a requisição do cliente.
No seguinte exemplo, escrevemos um log com o método HTTP e a URL e depois enviamos como resposta um "Hello World!!".
package main
import (
"log"
"net/http"
)
func main() {
s := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println(r.Method, r.URL)
w.Write([]byte("Hello World!!"))
}),
}
err := s.ListenAndServe()
if err != nil {
log.Fatal(err)
}
}
Se ao iniciar o servidor tudo tiver ido bem, a execução será interrompida na chamada a ListenAndServe porque é bloqueante, e todas as requisições HTTP que chegarem serão atendidas com a função handler que definimos.
Neste exemplo, sempre devolvemos a mesma resposta, sem importar a URL que chegue.
Servindo mais páginas
Para servir mais páginas, por exemplo a de início e a de login, devemos adicionar manualmente condições.
s := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println(r.Method, r.URL)
if r.URL.Path == "/" {
w.Write([]byte("<h1>Inicio</h1>"))
return
}
if r.URL.Path == "/login" {
w.Write([]byte("<h1>Login</h1>"))
return
}
// ...
}),
}
Desta forma, obteremos a página de login ao acessar http://localhost:8080/login e a página de início em http://localhost:8080/
Como você já deve ter adivinhado, este código é frágil e pouco sustentável, mas por sorte existem os roteadores HTTP, também chamados de Mux, para alegrar o nosso dia.
Acompanhe-nos!
Siga o projeto no Discord SeniorGo - Latam.
Junte-se ao projeto no GitHub.
Veja o vídeo completo no YouTube.
Comentarios