HTTP Servers

HTTP серверы (HTTP Servers)|HTTP Servers #

// Написание базового HTTP сервера очень легкореализуемо
// с пакетом `net/http`.
package main

import (
	"fmt"
	"net/http"
)

// Фундаментальная концепция серверов `net/http` - это
// *обработчики*. Обработчик - это объект, реализующий
// интерфейс `http.Handler`. Распространенным способом
// написания обработчика является использование адаптера
// `http.HandlerFunc` для функций с соответствующей
// подписью.
func hello(w http.ResponseWriter, req *http.Request) {

	// Функции, выполняющие функции обработчиков, принимают
	// в качестве аргументов `http.ResponseWriter` и
	// `http.Request`. Response writer используется для
	// наполнения HTTP-ответа. Здесь наш простой ответ
	// "hello\n".
	fmt.Fprintf(w, "hello\n")
}

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

	// Этот обработчик делает что-то более сложное,
	// читая все заголовки HTTP-запроса и вставляя их в
	// тело ответа.
	for name, headers := range req.Header {
		for _, h := range headers {
			fmt.Fprintf(w, "%v: %v\n", name, h)
		}
	}
}

func main() {

	// Мы регистрируем наши обработчики на сервере,
	// используя удобную функцию `http.HandleFunc`. Она
	// устанавливает *маршрут по умолчанию* в пакете
	// `net/http` и принимает функцию в качестве аргумента.
	http.HandleFunc("/hello", hello)
	http.HandleFunc("/headers", headers)

	// Наконец, мы вызываем `ListenAndServe` с портом и
	// обработчиком. nil говорит использовать только что
	// настроенный маршрутизатор по умолчанию.
	http.ListenAndServe(":8090", nil)
}
# Запускаем сервер в фоне.
$ go run http-servers.go &

# Делаем запрос по адресу `/hello`.
$ curl localhost:8090/hello
hello