0Pricing
Go Academy · Lezione

Modello middleware

Concatenare gli handler per logging e autenticazione

Modello middleware è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Che cos'è il middleware?

Il middleware è una funzione che avvolge un http.Handler per aggiungere funzionalità trasversali (logging, autenticazione, recovery) senza modificare la logica di business del gestore.

Firma del middleware

Un middleware è una funzione che accetta un http.Handler e restituisce un http.Handler:

type Middleware func(http.Handler) http.Handler

Middleware per il logging semplice

Registri ogni richiesta prima e dopo l'esecuzione del gestore:

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)
    })
}

Concatenazione dei middleware

Applichi più livelli di middleware annidandoli:

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

Helper per la catena di middleware

Crei una funzione per la catena che applichi i middleware nell'ordine, senza un annidamento eccessivo:

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)

Middleware di autenticazione

Controlli l'autenticazione prima di chiamare il gestore successivo. Restituisca subito 401 se il token è mancante o non valido.

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)
    })
}

Middleware per il recupero dai panic

Intercetti i panic dei gestori affinché il server non vada in crash:

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)
    })
}

Passare dati tramite il contesto

Il middleware può associare dati al contesto della richiesta per renderli disponibili ai gestori successivi:

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

Wrapper della risposta

Acquisisca il codice di stato scritto dal gestore avvolgendo ResponseWriter:

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

L'ordine è importante

Il middleware viene eseguito nell'ordine in cui avvolge il gestore. L'autenticazione deve essere eseguita prima del rate limiting; il recupero dai panic deve essere più esterno, così intercetta i panic degli altri middleware.

Middleware per route e globale

Applichi il middleware globale, come logging e recovery, all'intero mux. Applichi il middleware specifico per una route, come autenticazione e rate limiting, a gruppi di route specifici usando un subrouter o un wrapper del gestore.

Verifica rapida

Qual è la firma corretta di un middleware HTTP in Go?

Riepilogo: pattern middleware

Punti chiave:

  • Middleware: func(http.Handler) http.Handler
  • Annidare i middleware; utilizzare un helper Chain per maggiore chiarezza
  • Recovery all'esterno; autenticazione prima della logica di business
  • Passare i dati ai gestori successivi tramite il contesto

Domande Frequenti

La lezione «Modello middleware» è gratuita?

Sì — il testo completo di «Modello middleware» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «Modello middleware»?

Concatenare gli handler per logging e autenticazione Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Modello middleware»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Creare un server HTTP
  2. Routing e parametri del percorso
  3. Modello middleware
  4. Arresto graduale
← Torna a Go Academy