0Pricing
Go Academy · Урок

Шаблон промежуточного обработчика

Объединение обработчиков в цепочку для ведения журналов и аутентификации

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

Что такое промежуточное ПО

Промежуточное ПО — это функция, оборачивающая http.Handler для добавления сквозных задач (журналирование, аутентификация, восстановление после паники) без изменения бизнес-логики обработчика.

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

Промежуточное ПО — это функция, принимающая http.Handler и возвращающая http.Handler:

type Middleware func(http.Handler) http.Handler

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

Записывайте сведения о каждом запросе до и после выполнения обработчика:

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("done %s", r.URL.Path)
    })
}

Объединение промежуточного ПО в цепочку

Применяйте несколько уровней промежуточного ПО, вкладывая их друг в друга:

handler := Logger(Auth(RateLimit(myHandler)))
http.ListenAndServe(":8080", handler)

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

Создайте функцию цепочки, чтобы применять промежуточное ПО в нужном порядке без глубокой вложенности:

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

Промежуточное ПО Auth

Проверяйте аутентификацию до вызова следующего обработчика. Если токен отсутствует или недействителен, сразу возвращайте 401.

func Auth(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        token := r.Header.Get("Authorization")
        if !isValid(token) {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }
        next.ServeHTTP(w, r)
    })
}

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

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

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

Передача данных через контекст

Промежуточное ПО может добавлять данные в контекст запроса для последующих обработчиков:

ctx := context.WithValue(r.Context(), userKey, user)
next.ServeHTTP(w, r.WithContext(ctx))

Обёртка ответа

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

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

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

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

Промежуточное ПО для отдельных маршрутов и глобальное промежуточное ПО

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

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

Какова правильная сигнатура HTTP-промежуточного ПО в Go?

Итоги: шаблон промежуточного ПО

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

  • Промежуточное ПО: func(http.Handler) http.Handler
  • Объединяйте его в цепочку с помощью вложенности; для ясности используйте вспомогательную функцию Chain
  • Recovery — внешним; Auth — перед бизнес-логикой
  • Передавайте данные последующим обработчикам через контекст

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

Урок «Шаблон промежуточного обработчика» бесплатный?

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

Чему я научусь в уроке «Шаблон промежуточного обработчика»?

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

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

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

Сколько времени занимает урок «Шаблон промежуточного обработчика»?

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

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

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

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

  1. Создание HTTP-сервера
  2. Маршрутизация и параметры пути
  3. Шаблон промежуточного обработчика
  4. Корректное завершение работы
← Назад к Go Academy