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