Введение
Этот лабораторный проект旨在测试您使用 Golang 中的net/http包编写基本 HTTP 服务器的能力。
HTTP-сервер
Требуется написать простой HTTP-сервер, который может обрабатывать два маршрута: /hello и /headers. Маршрут /hello должен возвращать простой ответ "hello", а маршрут /headers должен возвращать все HTTP-заголовки запроса.
- Сервер должен использовать пакет
net/http. - Маршрут
/helloдолжен возвращать ответ "hello". - Маршрут
/headersдолжен возвращать все HTTP-заголовки запроса. - Сервер должен слушать порт
8090.
## Запустите сервер в фоновом режиме.
$ go run http-servers.go &
## Доступ к маршруту `/hello`.
$ curl localhost:8090/hello
hello
Ниже представлен полный код:
// Написание базового HTTP-сервера легко с использованием
// пакета `net/http`.
package main
import (
"fmt"
"net/http"
)
// Фундаментальная концепция в HTTP-серверах `net/http` - это
// *обработчики*. Обработчик - это объект, реализующий интерфейс
// `http.Handler`. Обычный способ написания обработчика - это использование
// адаптера `http.HandlerFunc` для функций с соответствующей сигнатурой.
func hello(w http.ResponseWriter, req *http.Request) {
// Функции, служащие обработчиками, принимают
// `http.ResponseWriter` и `http.Request` в качестве
// аргументов. Объект `http.ResponseWriter` используется для заполнения
// 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)
}
Резюме
В этом лабораторном проекте вам требовалось написать простой HTTP-сервер, способный обрабатывать два маршрута: /hello и /headers. Вы узнали, как использовать пакет net/http для написания обработчиков для каждого маршрута и регистрации их на сервере. Наконец, вы узнали, как запустить сервер и слушать входящие запросы.