Middleware — функция, которая оборачивает HTTP-хендлер, добавляя логику до/после обработки запроса.
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r) // вызываем следующий хендлер
log.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
})
}
func authMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
if token == "" {
http.Error(w, "unauthorized", 401)
return // НЕ вызываем next
}
next.ServeHTTP(w, r)
})
}
Цепочка middleware:
handler := loggingMiddleware(authMiddleware(myHandler))
http.ListenAndServe(":8080", handler)
Это паттерн «decorator». Каждый middleware — слой луковицы.