Ответ
В Go создание HTTP-сервера осуществляется с помощью встроенного пакета net/http
. Это одна из самых сильных сторон стандартной библиотеки языка.
Основные компоненты:
Обработчик (Handler): Функция или структура, которая обрабатывает HTTP-запросы. Она принимает два аргумента:
http.ResponseWriter
: интерфейс для записи ответа клиенту (заголовки, статус-код, тело ответа).*http.Request
: структура, содержащая всю информацию о входящем запросе (метод, URL, заголовки, тело запроса).
Мультиплексор (ServeMux): Роутер, который сопоставляет URL входящего запроса с соответствующим обработчиком.
Сервер (Server): Структура, которая слушает TCP-соединения и передает их мультиплексору.
Пример простого сервера:
package main
import (
"fmt"
"log"
"net/http"
)
// handler - наша функция-обработчик для пути "/"
func handler(w http.ResponseWriter, r *http.Request) {
// Записываем тело ответа
fmt.Fprintf(w, "Hello, World! You've requested: %sn", r.URL.Path)
}
func main() {
// Регистрируем наш обработчик для всех запросов к пути "/"
// на стандартном мультиплексоре (DefaultServeMux).
http.HandleFunc("/", handler)
// Запускаем сервер на порту 8080.
// Второй аргумент 'nil' означает, что используется DefaultServeMux.
log.Println("Starting server on :8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
Ключевые моменты и лучшие практики:
http.ListenAndServe
: Простая функция для запуска сервера. Для production-окружения рекомендуется создавать экземплярhttp.Server
вручную, чтобы настроить таймауты (ReadTimeout
,WriteTimeout
,IdleTimeout
) для защиты от атак типа Slowloris.- Роутинг: Для сложных приложений стандартного
ServeMux
может быть недостаточно. Часто используются сторонние роутеры, такие какchi
,gin
илиgorilla/mux
, которые предоставляют больше возможностей (параметры в URL, middleware, группы роутов). - Middleware: Это функции-обертки, которые выполняют сквозную логику (логирование, аутентификация, сжатие) до или после основного обработчика.
- HTTP/2: Сервер Go автоматически использует HTTP/2, если клиент его поддерживает и соединение защищено с помощью TLS.