Шаблон промежуточного обработчика
Объединение обработчиков в цепочку для ведения журналов и аутентификации
«Шаблон промежуточного обработчика» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Создание HTTP-сервера
- Маршрутизация и параметры пути
- Шаблон промежуточного обработчика
- Корректное завершение работы