Базовый HTTP-сервер на Go

Beginner

This tutorial is from open-source community. Access the source code

Введение

Этот лабораторный проект旨在测试您使用 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 для написания обработчиков для каждого маршрута и регистрации их на сервере. Наконец, вы узнали, как запустить сервер и слушать входящие запросы.