8.1 KiB
Negroni
Negroni ist ein Ansatz für eine idiomatische Middleware in Go. Sie ist klein, nicht-intrusiv und unterstützt die Nutzung von net/http
Handlern.
Wenn Dir die Idee hinter Martini gefällt, aber Du denkst, es stecke zu viel Magie darin, dann ist Negroni eine passende Alternative.
Wo fange ich an?
Nachdem Du Go installiert und den GOPATH eingerichtet hast, erstelle eine .go
-Datei. Nennen wir sie server.go
.
package main
import (
"github.com/codegangsta/negroni"
"net/http"
"fmt"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Willkommen auf der Homepage!")
})
n := negroni.Classic()
n.UseHandler(mux)
n.Run(":3000")
}
Installiere nun das Negroni Package (go 1.1 und höher werden vorausgesetzt):
go get github.com/codegangsta/negroni
Dann starte Deinen Server:
go run server.go
Nun läuft ein net/http
-Webserver von Go unter localhost:3000
.
Hilfe benötigt?
Wenn Du eine Frage hast oder Dir ein bestimmte Funktion wünscht, nutze die Mailing Liste. Issues auf Github werden ausschließlich für Bug Reports und Pull Requests genutzt.
Ist Negroni ein Framework?
Negroni ist kein Framework. Es ist eine Bibliothek, geschaffen, um kompatibel mit net/http
zu sein.
Routing?
Negroni ist BYOR (Bring your own Router - Nutze Deinen eigenen Router). Die Go-Community verfügt bereits über eine Vielzahl von großartigen Routern. Negroni versucht möglichst alle zu unterstützen, indem es net/http
vollständig unterstützt. Beispielsweise sieht eine Implementation mit Gorilla Mux folgendermaßen aus:
router := mux.NewRouter()
router.HandleFunc("/", HomeHandler)
n := negroni.New(Middleware1, Middleware2)
// Oder nutze eine Middleware mit der Use()-Funktion
n.Use(Middleware3)
// Der Router kommt als letztes
n.UseHandler(router)
n.Run(":3000")
negroni.Classic()
negroni.Classic()
stellt einige Standard-Middlewares bereit, die für die meisten Anwendungen von Nutzen ist:
negroni.Recovery
- Middleware für Panic Recovery .negroni.Logging
- Anfrage/Rückmeldungs-Logging-Middleware.negroni.Static
- Ausliefern von statischen Dateien unter dem "public" Verzeichnis.
Dies macht es wirklich einfach, mit den nützlichen Funktionen von Negroni zu starten.
Handlers
Negroni stellt einen bidirektionalen Middleware-Flow bereit. Dies wird durch das negroni.Handler
-Interface erreicht:
type Handler interface {
ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
}
Wenn eine Middleware nicht bereits den ResponseWriter genutzt hat, sollte sie die nächste http.HandlerFunc
in der Verkettung von Middlewares aufrufen und diese ausführen. Das kann von großem Nutzen sein:
func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
// Mache etwas vor dem Aufruf
next(rw, r)
// Mache etwas nach dem Aufruf
}
Und Du kannst eine Middleware durch die Use
-Funktion der Verkettung von Middlewares zuordnen.
n := negroni.New()
n.Use(negroni.HandlerFunc(MyMiddleware))
Stattdessen kannst Du auch herkömmliche http.Handler
zuordnen:
n := negroni.New()
mux := http.NewServeMux()
// Ordne Deine Routen zu
n.UseHandler(mux)
n.Run(":3000")
Run()
Negroni hat eine nützliche Funktion namens Run
. Run
übernimmt eine Zeichenkette addr
ähnlich wie http.ListenAndServe.
n := negroni.Classic()
// ...
log.Fatal(http.ListenAndServe(":8080", n))
Routenspezifische Middleware
Wenn Du eine Gruppe von Routen hast, welche alle die gleiche Middleware ausführen müssen, kannst Du einfach eine neue Negroni-Instanz erstellen und sie als Route-Handler nutzen:
router := mux.NewRouter()
adminRoutes := mux.NewRouter()
// Füge die Admin-Routen hier hinzu
// Erstelle eine neue Negroni-Instanz für die Admin-Middleware
router.Handle("/admin", negroni.New(
Middleware1,
Middleware2,
negroni.Wrap(adminRoutes),
))
Middlewares von Dritten
Hier ist eine aktuelle Liste von Middlewares, die kompatible mit Negroni sind. Tue Dir keinen Zwang an, Dich einzutragen, wenn Du selbst eine Middleware programmiert hast:
Middleware | Autor | Beschreibung |
---|---|---|
RestGate | Prasanga Siripala | Sichere Authentifikation für Endpunkte einer REST API |
Graceful | Tyler Bunnell | Graceful HTTP Shutdown |
secure | Cory Jacobsen | Eine Middleware mit ein paar nützlichen Sicherheitseinstellungen |
JWT Middleware | Auth0 | Eine Middleware die nach JWTs im Authorization -Feld des Header sucht und sie dekodiert. |
binding | Matt Holt | Data Binding von HTTP-Anfragen in Structs |
logrus | Dan Buch | Logrus-basierender Logger |
render | Cory Jacobsen | Rendere JSON, XML und HTML Vorlagen |
gorelic | Jingwen Owen Ou | New Relic Agent für die Go-Echtzeitumgebung |
gzip | phyber | Kompression von HTTP-Rückmeldungen via GZIP |
oauth2 | David Bochenski | oAuth2 Middleware |
sessions | David Bochenski | Session Management |
permissions2 | Alexander Rødseth | Cookies, Benutzer und Berechtigungen |
onthefly | Alexander Rødseth | Generiere TinySVG, HTML und CSS spontan |
cors | Olivier Poitrey | Cross Origin Resource Sharing (CORS) Unterstützung |
xrequestid | Andrea Franz | Eine Middleware die zufällige X-Request-Id-Header jedem Request anfügt |
VanGoH | Taylor Wrobel | Configurable AWS-Style HMAC-basierte Middleware zur Authentifikation |
stats | Florent Messa | Speichere wichtige Informationen über Deine Webanwendung (Reaktionszeit, etc.) |
Beispiele
Alexander Rødseth programmierte mooseware, ein Grundgerüst zum Erstellen von Negroni Middleware-Handerln.
Aktualisieren in Echtzeit?
gin und fresh aktualisieren Deine Negroni-Anwendung automatisch.
Unverzichbare Informationen für Go- & Negronineulinge
- Nutze einen Kontext zum Übertragen von Middlewareinformationen an Handler (Englisch)
- Middlewares verstehen (Englisch)
Über das Projekt
Negroni wurde obsseziv von Niemand gerigeren als dem Code Gangsta entwickelt.