Go Em Exemplos: HTTP Server

Criar um servidor HTTP básico é bem simples utilizando o pacote net/http.

package main
import (
    "fmt"
    "net/http"
)

Um conceito fundamental nos servidores do pacote net/http é o de handlers. Um handler é um objeto implementando a interface http.Handler. Uma forma comum de escrever um handler é usando o adaptador http.HandlerFunc em funções com a assinatura apropriada.

func hello(w http.ResponseWriter, req *http.Request) {

Funções que servem como handlers recebem dois parâmetrods, primeiro o http.ResponseWriter e segundo o http.Request. O response writer é usado para escrever a resposta HTTP. Aqui um exemplo de resposta com um simples “hello\n”.

    fmt.Fprintf(w, "hello\n")
}
func headers(w http.ResponseWriter, req *http.Request) {

Este handler faz algo um pouco mais sofisticado,

    //lendo todo o header, ou cabeçalho, da requisição

HTTP e repetindo no corpo da resposta.

    for name, headers := range req.Header {
        for _, h := range headers {
            fmt.Fprintf(w, "%v: %v\n", name, h)
        }
    }
}
func main() {

Os handlers são registrados em rotas do servidor usando função http.HandleFunc que configura o roteador padrão no pacote net/http e recebe uma função como argumento.

    http.HandleFunc("/hello", hello)
    http.HandleFunc("/headers", headers)

Finalmente, é chamada a função ListenAndServe com indicação da porta em que o servidor será servido e o handler. Passando nil como handler, faz com que o roteador padrão seja utilizado.

    http.ListenAndServe(":8090", nil)
}

Executa o servidor em background.

$ go run http-servers.go &

Acessa a rota /hello.

$ curl localhost:8090/hello
hello

Próximo exemplo: Context.