← ко всем постам
2026-07-15 · #web

Middleware в net/http без магии

Middleware — это функция, которая принимает http.Handler и возвращает новый http.Handler, добавляя поведение до и после основного обработчика.

func logging(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))
    })
}

Составление цепочки

Обёртки вкладываются друг в друга: logging(auth(handler)). Порядок важен — внешняя обёртка отработает первой на входе и последней на выходе.

Тот же паттерн решает восстановление после паники: обёртка с defer recover() защищает весь сервер от падения из-за одного запроса.