Pular para o conteúdo
murad.guide

Aplicações Web

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.

Mapa visual de Go: HTTP handlers

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)
}