Podstawy łańcucha middleware HTTP
Opakowywanie http.Handler i łączenie go za pomocą next
Podstawy łańcucha middleware HTTP to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.
Middleware w net/http
W bibliotece standardowej Go middleware to funkcja, która przyjmuje http.Handler i zwraca nowy http.Handler z dodatkowym zachowaniem opakowującym oryginał.
type Middleware func(http.Handler) http.HandlerPodstawowe middleware
Wewnętrzny HandlerFunc opakowuje oryginalny program obsługi logiką wykonywaną przed nim i po nim:
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)
})
}Stosowanie middleware
Opakowuj programy obsługi przed zarejestrowaniem ich w muxie:
mux := http.NewServeMux()
mux.Handle("/api/", Logger(Auth(apiHandler)))
http.ListenAndServe(":8080", mux)Pomocnicza funkcja łańcucha middleware
Funkcja łańcucha stosuje wiele middleware w czytelnej kolejności od lewej do prawej:
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)Kontekst w middleware
Dołączaj wartości związane z żądaniem, tworząc kontekst pochodny i opakowując nim żądanie:
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))
})
}Wrapper zapisu odpowiedzi
Przechwytuj kod statusu zapisany przez program obsługi, opakowując ResponseWriter:
type captureWriter struct {
http.ResponseWriter
status int
}
func (cw *captureWriter) WriteHeader(code int) {
cw.status = code
cw.ResponseWriter.WriteHeader(code)
}Middleware odzyskiwania po panice
Odzyskuj działanie po panikach, aby zapobiec awarii serwera:
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)
})
}Kolejność ma znaczenie
Middleware jest wykonywane w kolejności, w jakiej opakowuje program obsługi. Recovery powinno znajdować się na zewnętrznej warstwie (opakowywać wszystko). Auth powinno być wykonywane przed logiką biznesową. Logging zwykle znajduje się na zewnętrznej warstwie, za Recovery.
Zgodność z routerami innych firm
Ponieważ middleware korzysta ze standardowej sygnatury func(http.Handler) http.Handler, jest zgodne z chi, gorilla/mux oraz każdym routerem przyjmującym http.Handler.
Globalne a specyficzne dla trasy
Stosuj middleware globalnie do całego muxa albo opakowuj pojedyncze programy obsługi, aby uzyskać zachowanie specyficzne dla trasy. Podroutery chi ułatwiają stosowanie middleware na poziomie grup.
Testowanie middleware
Używaj httptest.NewRecorder i httptest.NewRequest, aby testować middleware w izolacji bez uruchamiania rzeczywistego serwera.
w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/", nil)
Logger(http.HandlerFunc(noop)).ServeHTTP(w, r)Szybkie sprawdzenie
Jaka jest standardowa sygnatura middleware w net/http?
Podsumowanie: łańcuch middleware
Najważniejsze informacje:
- func(http.Handler) http.Handler to standardowa sygnatura
- Używaj funkcji pomocniczej Chain, aby uniknąć głębokiego zagnieżdżania
- r.WithContext(ctx) do dołączania wartości; opakuj writer, aby rejestrować status
- Recovery na zewnętrznej warstwie; Auth przed logiką biznesową; Logging za Recovery
Często zadawane pytania
Czy lekcja „Podstawy łańcucha middleware HTTP” jest bezpłatna?
Tak — pełny tekst „Podstawy łańcucha middleware HTTP” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Podstawy łańcucha middleware HTTP”?
Opakowywanie http.Handler i łączenie go za pomocą next Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Go Academy?
Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Podstawy łańcucha middleware HTTP”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?
Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy łańcucha middleware HTTP
- Middleware logowania i identyfikatora żądania
- Middleware uwierzytelniania i limitowania ruchu
- Middleware CORS i odzyskiwania po panic