#buildinpublic #SeniorGo 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.