0Pricing
Go Academy · Урок

Основы цепочки HTTP-промежуточных обработчиков

Оборачивание http.Handler и объединение в цепочку с next

«Основы цепочки HTTP-промежуточных обработчиков» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Промежуточное ПО в net/http

В стандартной библиотеке Go промежуточное ПО — это функция, которая принимает http.Handler и возвращает новый http.Handler с дополнительным поведением, обёрнутым вокруг исходного.

type Middleware func(http.Handler) http.Handler

Базовое промежуточное ПО

Внутренний HandlerFunc оборачивает исходный обработчик логикой, выполняемой до и после него:

func Logger(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("→ %s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
        log.Printf("← %s %s done", r.Method, r.URL.Path)
    })
}

Применение промежуточного ПО

Оборачивайте обработчики до их регистрации в мультиплексоре:

mux := http.NewServeMux()
mux.Handle("/api/", Logger(Auth(apiHandler)))
http.ListenAndServe(":8080", mux)

Вспомогательная функция цепочки промежуточного ПО

Функция цепочки применяет несколько единиц промежуточного ПО в понятном порядке — слева направо:

func Chain(h http.Handler, ms ...func(http.Handler) http.Handler) http.Handler {
    for i := len(ms)-1; i >= 0; i-- { h = ms[i](h) }
    return h
}
// Usage: Chain(handler, Logger, Auth, RateLimit)

Контекст в промежуточном ПО

Добавляйте значения, относящиеся к области действия запроса, создавая производный контекст и оборачивая запрос:

func RequestID(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        id := uuid.New().String()
        ctx := context.WithValue(r.Context(), reqIDKey, id)
        w.Header().Set("X-Request-ID", id)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

Обёртка для записи ответа

Перехватывайте код статуса, записанный обработчиком, оборачивая ResponseWriter:

type captureWriter struct {
    http.ResponseWriter
    status int
}
func (cw *captureWriter) WriteHeader(code int) {
    cw.status = code
    cw.ResponseWriter.WriteHeader(code)
}

Промежуточное ПО для восстановления после паники

Восстанавливайте выполнение после паник, чтобы сервер не завершал работу:

func Recovery(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if rec := recover(); rec != nil {
                http.Error(w, "Internal Server Error", 500)
            }
        }()
        next.ServeHTTP(w, r)
    })
}

Порядок имеет значение

Промежуточное ПО выполняется в порядке, в котором оно оборачивает обработчик. Recovery должно находиться снаружи всех остальных компонентов и оборачивать их. Аутентификация должна выполняться до бизнес-логики. Ведение журналов обычно располагается снаружи всех компонентов после Recovery.

Совместимость со сторонними маршрутизаторами

Поскольку промежуточное ПО использует стандартную сигнатуру func(http.Handler) http.Handler, оно совместимо с chi, gorilla/mux и любым маршрутизатором, который принимает http.Handler.

Глобальное и предназначенное для маршрута промежуточное ПО

Применяйте промежуточное ПО глобально ко всему мультиплексору или оборачивайте отдельные обработчики для поведения, предназначенного только для конкретного маршрута. Подмаршрутизаторы chi упрощают применение промежуточного ПО на уровне группы.

Тестирование промежуточного ПО

Используйте httptest.NewRecorder и httptest.NewRequest, чтобы тестировать промежуточное ПО изолированно, не запуская настоящий сервер.

w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/", nil)
Logger(http.HandlerFunc(noop)).ServeHTTP(w, r)

Быстрая проверка

Какова стандартная сигнатура промежуточного ПО net/http?

Повторение: цепочка промежуточного ПО

Ключевые моменты:

  • func(http.Handler) http.Handler — стандартная сигнатура
  • Используйте вспомогательную функцию Chain, чтобы избежать глубокой вложенности
  • r.WithContext(ctx) — для добавления значений; обёртка записи — для сохранения статуса
  • Recovery располагается снаружи всех компонентов; аутентификация выполняется до бизнес-логики; ведение журналов — после Recovery

Часто задаваемые вопросы

Урок «Основы цепочки HTTP-промежуточных обработчиков» бесплатный?

Да — полный текст урока «Основы цепочки HTTP-промежуточных обработчиков» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Основы цепочки HTTP-промежуточных обработчиков»?

Оборачивание http.Handler и объединение в цепочку с next Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Основы цепочки HTTP-промежуточных обработчиков»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы цепочки HTTP-промежуточных обработчиков
  2. Журналирование и промежуточный обработчик идентификатора запроса
  3. Промежуточные обработчики аутентификации и ограничения частоты
  4. Промежуточные обработчики CORS и восстановления после паники
← Назад к Go Academy