6.7 KiB
Negroni
Negroni é uma abordagem idiomática para middleware web em Go. É pequeno, não intrusivo, e incentiva uso da biblioteca net/http
.
Se gosta da idéia do Martini, mas acha que contém muita mágica, então Negroni é ideal.
Começando
Depois de instalar Go e definir seu GOPATH, criar seu primeirto arquivo .go
. Iremos chamá-lo 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, "Welcome to the home page!")
})
n := negroni.Classic()
n.UseHandler(mux)
n.Run(":3000")
}
Depois instale o pacote Negroni (go 1.1 ou superior)
go get github.com/urfave/negroni
Depois execute seu servidor:
go run server.go
Agora terá um servidor web Go net/http rodando em localhost:3000
.
Precisa de Ajuda?
Se você tem uma pergunta ou pedido de recurso,go ask the mailing list. O Github issues para o Negroni será usado exclusivamente para Reportar bugs e pull requests.
Negroni é um Framework?
Negroni não é a framework. É uma biblioteca que é desenhada para trabalhar diretamente com net/http.
Roteamento?
Negroni é TSPR(Traga seu próprio Roteamento). A comunidade Go já tem um grande número de roteadores http disponíveis, Negroni tenta rodar bem com todos eles pelo suporte total net/http
/ Por exemplo, a integração com Gorilla Mux se parece com isso:
router := mux.NewRouter()
router.HandleFunc("/", HomeHandler)
n := negroni.New(Middleware1, Middleware2)
// Or use a middleware with the Use() function
n.Use(Middleware3)
// router goes last
n.UseHandler(router)
n.Run(":3000")
negroni.Classic()
negroni.Classic()
fornece alguns middlewares padrão que são úteis para maioria das aplicações:
negroni.Recovery
- Panic Recovery Middleware.negroni.Logging
- Request/Response Logging Middleware.negroni.Static
- Static File serving under the "public" directory.
Isso torna muito fácil começar com alguns recursos úteis do Negroni.
Handlers
Negroni fornece um middleware de fluxo bidirecional. Isso é feito através da interface negroni.Handler
:
type Handler interface {
ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
}
Se um middleware não tenha escrito o ResponseWriter, ele deve chamar a próxima http.HandlerFunc
na cadeia para produzir o próximo handler middleware. Isso pode ser usado muito bem:
func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
// do some stuff before
next(rw, r)
// do some stuff after
}
E pode mapear isso para a cadeia de handler com a função Use
:
n := negroni.New()
n.Use(negroni.HandlerFunc(MyMiddleware))
Você também pode mapear http.Handler
antigos:
n := negroni.New()
mux := http.NewServeMux()
// map your routes
n.UseHandler(mux)
n.Run(":3000")
Run()
Negroni tem uma função de conveniência chamada Run
. Run
pega um endereço de string idêntico para http.ListenAndServe.
n := negroni.Classic()
// ...
log.Fatal(http.ListenAndServe(":8080", n))
Middleware para Rotas Específicas
Se você tem um grupo de rota com rotas que precisam ser executadas por um middleware específico, pode simplesmente criar uma nova instância de Negroni e usar no seu Manipulador de rota.
router := mux.NewRouter()
adminRoutes := mux.NewRouter()
// add admin routes here
// Criar um middleware negroni para admin
router.Handle("/admin", negroni.New(
Middleware1,
Middleware2,
negroni.Wrap(adminRoutes),
))
Middleware de Terceiros
Aqui está uma lista atual de Middleware Compatíveis com Negroni. Sinta se livre para mandar um PR vinculando seu middleware se construiu um:
Middleware | Autor | Descrição |
---|---|---|
Graceful | Tyler Bunnell | Graceful HTTP Shutdown |
secure | Cory Jacobsen | Implementa rapidamente itens de segurança. |
binding | Matt Holt | Handler para mapeamento/validação de um request a estrutura. |
logrus | Dan Buch | Logrus-based logger |
render | Cory Jacobsen | Pacote para renderizar JSON, XML, e templates HTML. |
gorelic | Jingwen Owen Ou | New Relic agent for Go runtime |
gzip | phyber | Handler para adicionar compreção gzip para as requisições |
oauth2 | David Bochenski | Handler que prove sistema de login OAuth 2.0 para aplicações Martini. Google Sign-in, Facebook Connect e Github login são suportados. |
sessions | David Bochenski | Handler que provê o serviço de sessão. |
permissions | Alexander Rødseth | Cookies, usuários e permissões. |
onthefly | Alexander Rødseth | Pacote para gerar TinySVG, HTML e CSS em tempo real. |
Exemplos
Alexander Rødseth criou mooseware, uma estrutura para escrever um handler middleware Negroni.
Servidor com autoreload?
gin e fresh são aplicativos para autoreload do Negroni.
Leitura Essencial para Iniciantes em Go & Negroni
- Usando um contexto para passar informação de um middleware para o manipulador final
- Entendendo middleware
Sobre
Negroni é obsessivamente desenhado por ninguém menos que Code Gangsta