Si tienes algo de código que necesitas ejecutar en cada petición,
independientemente de la ruta que eventualmente se acabará invocando,
necesitas alguna manera de apilar http.Handlers
uno encima del otro y
ejecutarlos en secuencia. Este problema se resuelve elegantemente a
través de paquetes de semiware. Negroni
es un paquete de semiware popular que
facilita la construcción y apilamiento de
semiware, manteniendo intacta la naturaleza
composible del ecosistema web de Go.
Negroni
viene con algún semiware
predeterminado tal como el registro cronológico de eventos, recuperación
de errores, y la porción de fichero estático. Así que fuera de la caja
Negroni
te proporcionará un gran valor sin gastar demasiado.
El siguiente ejemplo muestra cómo utilizar una pila Negroni
con su
semiware integrado y cómo crear tu propio
semiware personalizado.
package main
import (
"log"
"net/http"
"github.com/codegangsta/negroni"
)
func main() {
// Semiware pila
n := negroni.New(
negroni.NewRecovery(),
negroni.HandlerFunc(MiSemiware)
negroni.NewLogger(),
negroni.NewStatic(http.Dir("publico"))
)
n.Run(":8080")
}
func MiSemiware(rw http.ResponseWriter, r *http.Request, siguiente http.HandlerFunc) {
log.Println("Inicio de sesión en la ruta...")
if r.URL.Query().Get("password") == "secreto123" {
siguiente(rw, r)
} else {
http.Error(rw, "no autorizado", 401)
}
log.Println("De vuelta inicia sesión en la ruta..." )
}
Negroni
.Negroni
con github.com/gorilla/mux
utilizando la interfaz http.Handler
.Negroni
para ciertos grupos de rutas en lugar de
crear la pila de toda la aplicación.