net/http

Тема дорожной карты · Golang

Пакет net/http — встроенная библиотека Go для HTTP-клиента и сервера, предоставляющая интерфейс http.Handler, маршрутизатор http.ServeMux, типы http.Request, http.ResponseWriter и http.Client, лежащие в основе практически каждого Golang-сервиса. HTTP-сервер запускается через http.ListenAndServe(":8080", mux) с регистрацией обработчиков через mux.Handle или mux.HandleFunc, а http.Client пакета обрабатывает исходящие запросы с настраиваемыми таймаутами, параметрами транспорта и cookie jar. Популярные фреймворки Gin, Echo, Fiber и Chi все строятся поверх интерфейса http.Handler пакета net/http, поэтому понимание стандартной библиотеки делает каждый фреймворк немедленно понятным. Middleware в Golang оборачивает http.Handler-значения, а context.Context из r.Context() переносит значения области запроса — трейс-спаны OpenTelemetry и идентификаторы аутентифицированных пользователей — через стек вызовов. Пакет net/http также поддерживает HTTP/2 «из коробки» через http.ListenAndServeTLS, TLS-конфигурацию через tls.Config и graceful shutdown с помощью http.Server.Shutdown(ctx) — необходимые компоненты для zero-downtime развёртываний в Kubernetes.

Как это работает

net/http знаменита batteries-included: net/http (production-уровневый HTTP клиент + сервер), encoding/json/xml/csv (сериализация), database/sql (интерфейс — в паре с драйвером типа pgx, go-sql-driver/mysql), os + os/exec + io/fs (файлы, процессы), crypto/* (хеширование, шифры, TLS), context (cancellation + значения), time, regexp, text/template / html/template, log/slog (структурированное логирование, 1.21+).

Когда применять

По умолчанию stdlib — большинство, к чему тянутся в npm/pip других языков, уже в Go-stdlib. log/slog — для нового логирования (заменяет log + logrus + zap для большинства нужд). net/http-сервер напрямую — пока реально не нужен фреймворк. database/sql + драйвер — вместо ORM, кроме случая многих тривиальных CRUD-эндпойнтов.

Типичные ошибки

Ловушки net/http: свой HTTP-роутинг вместо net/http.ServeMux (route patterns в 1.22 — достаточно для многих приложений); игнор http.Server.ReadTimeout и WriteTimeout (slowloris / hung-connection уязвимости); time.Now() прямо в тестах (мок через интерфейс или clockwork); json.Marshal неэкспортированных полей struct (тихо ноль — пишите с заглавной или используйте json:"...").

Связанные понятия

Полезные ресурсы