Capítulo 30
Go: HTTP handlers
2 min de leitura 365 palavras 1 gravura
Neste capítulo você vai atender /saude em 127.0.0.1 com net/http. O projeto-fio é o Ateliê Boa Viagem, ateliê digital fictício em Boa Viagem, Recife.
Seu ponto de partida
Use o exemplo 30-go-http do pacote anexo e copie inicio/ para uma pasta de prática fora do original. A raiz do exemplo é a referência completa desta etapa.
Use servidor só em 127.0.0.1 quando o README do exemplo pedir HTTP local. Abrir ou testar não publica nada.
Como praticar
Leia → copie ou digite → mude uma coisa → preveja → salve → recarregue → confira. Restaure cada experiência antes da próxima. Faça as atividades antes de abrir as respostas comentadas.

Handler e ListenAndServe
http.HandleFunc e servidor em 127.0.0.1:8790.
Faça na sua cópia
Confira o trecho no contexto do exemplo antes de mudar.
http.HandleFunc("/saude", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"ok":true}`))
})
http.ListenAndServe("127.0.0.1:8790", nil)
Mude uma coisa e preveja
Inclua campo servico com nome do Ateliê.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
JSON atualizado.
Se não acontecer
Reinicie o binário/processo go run.
Teste de handler
httptest.NewRecorder e http.NewRequest testam sem porta real.
Faça na sua cópia
Confira o trecho no contexto do exemplo antes de mudar.
req := httptest.NewRequest(http.MethodGet, "/saude", nil)
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
Mude uma coisa e preveja
Asserte status 200.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
Teste passa.
Se não acontecer
Importe net/http/httptest.
Método não permitido
Responda 405 para POST em /saude se só GET for válido.
Faça na sua cópia
Confira o trecho no contexto do exemplo antes de mudar.
if r.Method != http.MethodGet {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
Mude uma coisa e preveja
Teste POST.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
Se não acontecer
Cubra com teste.
Atividades
Atividade 1
Como escutar só local?
Atividade 2
Para que httptest?
Atividade 3
Qual status para método errado?
Respostas comentadas
Resposta da atividade 1
ListenAndServe(“127.0.0.1:porta”, …)
Resposta da atividade 2
Testar handlers sem abrir porta.
Resposta da atividade 3
405
O arquivo completo
Referência do exemplo 30-go-http, reproduzida aqui para que você possa conferir sem sair da página.
main.go
package main
import (
"net/http"
)
func saude(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"ok":true,"servico":"Ateliê Boa Viagem"}`))
}
func main() {
http.HandleFunc("/saude", saude)
http.ListenAndServe("127.0.0.1:8790", nil)
}