Fundamentos de la cadena de middleware HTTP
Envoltorio de http.Handler y encadenamiento con next
Fundamentos de la cadena de middleware HTTP es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.
Middleware en net/http
En la biblioteca estándar de Go, el middleware es una función que acepta un http.Handler y devuelve un nuevo http.Handler con comportamiento adicional alrededor del original.
type Middleware func(http.Handler) http.HandlerMiddleware básico
El HandlerFunc interno envuelve el controlador original con lógica previa y posterior:
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)
})
}Aplicación del middleware
Envuelva los controladores antes de registrarlos en el mux:
mux := http.NewServeMux()
mux.Handle("/api/", Logger(Auth(apiHandler)))
http.ListenAndServe(":8080", mux)Asistente para encadenar middleware
Una función de cadena aplica varios middlewares en un orden legible, de izquierda a derecha:
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)Contexto en el middleware
Asocie valores específicos de la solicitud creando un contexto derivado y envolviendo la solicitud:
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))
})
}Envoltorio del escritor de respuestas
Capture el código de estado escrito por un controlador envolviendo el ResponseWriter:
type captureWriter struct {
http.ResponseWriter
status int
}
func (cw *captureWriter) WriteHeader(code int) {
cw.status = code
cw.ResponseWriter.WriteHeader(code)
}Middleware de recuperación de panics
Recupérese de los panics para evitar que el servidor se bloquee:
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)
})
}El orden es importante
El middleware se ejecuta en el orden en que envuelve al controlador. Recovery debe ser el más externo (debe envolverlo todo). Auth debe ejecutarse antes de la lógica de negocio. Logging suele ser el más externo después de Recovery.
Compatibilidad con enrutadores de terceros
Como el middleware sigue la firma estándar func(http.Handler) http.Handler, es compatible con chi, gorilla/mux y cualquier enrutador que acepte http.Handler.
Global frente a específico de una ruta
Aplique el middleware globalmente a todo el mux o envuelva controladores individuales para un comportamiento específico de cada ruta. Los subenrutadores de chi facilitan la aplicación de middleware a nivel de grupo.
Pruebas del middleware
Use httptest.NewRecorder y httptest.NewRequest para probar el middleware de forma aislada, sin iniciar un servidor real.
w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/", nil)
Logger(http.HandlerFunc(noop)).ServeHTTP(w, r)Comprobación rápida
¿Cuál es la firma estándar del middleware de net/http?
Recapitulación: cadena de middleware
Puntos clave:
- func(http.Handler) http.Handler es la firma estándar
- Use un asistente Chain para evitar anidamientos profundos
- Use r.WithContext(ctx) para asociar valores y capture el writer para registrar el estado
- Recovery en la capa más externa; Auth antes de la lógica de negocio; Logging después de Recovery
Preguntas frecuentes
¿La lección «Fundamentos de la cadena de middleware HTTP» es gratis?
Sí — el texto completo de «Fundamentos de la cadena de middleware HTTP» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Fundamentos de la cadena de middleware HTTP»?
Envoltorio de http.Handler y encadenamiento con next Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Go Academy?
No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Fundamentos de la cadena de middleware HTTP»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Go Academy?
Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Fundamentos de la cadena de middleware HTTP
- Middleware de registro e identificador de solicitud
- Middleware de autenticación y limitación de tasa
- Middleware de CORS y recuperación ante panics