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.
Nachdem Du Go installiert und den GOPATH eingerichtet hast, erstelle eine .go
-Datei. Nennen wir sie server.go
.
package main
import (
"github.com/urfave/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/urfave/negroni
Dann starte Deinen Server:
go run server.go
Nun läuft ein net/http
-Webserver von Go unter localhost:3000
.
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.
Negroni ist kein Framework. Es ist eine Bibliothek, geschaffen, um kompatibel mit net/http
zu sein.
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()
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.
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")
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))
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),
))
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 |
---|---|---|
authz | Yang Luo | ACL, RBAC, ABAC Authorization middlware based on Casbin |
binding | Matt Holt | Data binding from HTTP requests into structs |
cloudwatch | Colin Steele | AWS cloudwatch metrics middleware |
cors | Olivier Poitrey | Cross Origin Resource Sharing (CORS) support |
csp | Awake Networks | Content Security Policy (CSP) support |
delay | Jeff Martinez | Add delays/latency to endpoints. Useful when testing effects of high latency |
New Relic Go Agent | Yadvendar Champawat | Official New Relic Go Agent (currently in beta) |
gorelic | Jingwen Owen Ou | New Relic agent for Go runtime |
Graceful | Tyler Bunnell | Graceful HTTP Shutdown |
gzip | phyber | GZIP response compression |
JWT Middleware | Auth0 | Middleware checks for a JWT on the Authorization header on incoming requests and decodes it |
logrus | Dan Buch | Logrus-based logger |
oauth2 | David Bochenski | oAuth2 middleware |
onthefly | Alexander Rødseth | Generate TinySVG, HTML and CSS on the fly |
permissions2 | Alexander Rødseth | Cookies, users and permissions |
prometheus | Rene Zbinden | Easily create metrics endpoint for the prometheus instrumentation tool |
render | Cory Jacobsen | Render JSON, XML and HTML templates |
RestGate | Prasanga Siripala | Secure authentication for REST API endpoints |
secure | Cory Jacobsen | Middleware that implements a few quick security wins |
sessions | David Bochenski | Session Management |
stats | Florent Messa | Store information about your web application (response time, etc.) |
VanGoH | Taylor Wrobel | Configurable AWS-Style HMAC authentication middleware |
xrequestid | Andrea Franz | Middleware that assigns a random X-Request-Id header to each request |
mgo session | Joel James | Middleware that handles creating and closing mgo sessions per request |
digits | Bilal Amarni | Middleware that handles Twitter Digits authentication |
stats | Chirag Gupta | Middleware that manages qps and latency stats for your endpoints and asynchronously flushes them to influx db |
Alexander Rødseth programmierte mooseware, ein Grundgerüst zum Erstellen von Negroni Middleware-Handerln.
gin und fresh aktualisieren Deine Negroni-Anwendung automatisch.
- Nutze einen Kontext zum Übertragen von Middlewareinformationen an Handler (Englisch)
- Middlewares verstehen (Englisch)
Negroni wurde obsseziv von Niemand gerigeren als dem Code Gangsta entwickelt.