1# Negroni [![GoDoc](https://godoc.org/github.com/codegangsta/negroni?status.svg)](http://godoc.org/github.com/codegangsta/negroni) [![wercker status](https://app.wercker.com/status/13688a4a94b82d84a0b8d038c4965b61/s "wercker status")](https://app.wercker.com/project/bykey/13688a4a94b82d84a0b8d038c4965b61) 2 3Negroni é uma abordagem idiomática para middleware web em Go. É pequeno, não intrusivo, e incentiva uso da biblioteca `net/http`. 4 5Se gosta da idéia do [Martini](http://github.com/go-martini/martini), mas acha que contém muita mágica, então Negroni é ideal. 6 7## Começando 8 9Depois de instalar Go e definir seu [GOPATH](http://golang.org/doc/code.html#GOPATH), criar seu primeirto arquivo `.go`. Iremos chamá-lo `server.go`. 10 11~~~ go 12package main 13 14import ( 15 "github.com/codegangsta/negroni" 16 "net/http" 17 "fmt" 18) 19 20func main() { 21 mux := http.NewServeMux() 22 mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { 23 fmt.Fprintf(w, "Welcome to the home page!") 24 }) 25 26 n := negroni.Classic() 27 n.UseHandler(mux) 28 n.Run(":3000") 29} 30~~~ 31 32Depois instale o pacote Negroni (**go 1.1** ou superior) 33~~~ 34go get github.com/codegangsta/negroni 35~~~ 36 37Depois execute seu servidor: 38~~~ 39go run server.go 40~~~ 41 42Agora terá um servidor web Go net/http rodando em `localhost:3000`. 43 44## Precisa de Ajuda? 45Se você tem uma pergunta ou pedido de recurso,[go ask the mailing list](https://groups.google.com/forum/#!forum/negroni-users). O Github issues para o Negroni será usado exclusivamente para Reportar bugs e pull requests. 46 47## Negroni é um Framework? 48Negroni **não** é a framework. É uma biblioteca que é desenhada para trabalhar diretamente com net/http. 49 50## Roteamento? 51Negroni é 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](http://github.com/gorilla/mux) se parece com isso: 52 53~~~ go 54router := mux.NewRouter() 55router.HandleFunc("/", HomeHandler) 56 57n := negroni.New(Middleware1, Middleware2) 58// Or use a middleware with the Use() function 59n.Use(Middleware3) 60// router goes last 61n.UseHandler(router) 62 63n.Run(":3000") 64~~~ 65 66## `negroni.Classic()` 67`negroni.Classic()` fornece alguns middlewares padrão que são úteis para maioria das aplicações: 68 69* `negroni.Recovery` - Panic Recovery Middleware. 70* `negroni.Logging` - Request/Response Logging Middleware. 71* `negroni.Static` - Static File serving under the "public" directory. 72 73Isso torna muito fácil começar com alguns recursos úteis do Negroni. 74 75## Handlers 76Negroni fornece um middleware de fluxo bidirecional. Isso é feito através da interface `negroni.Handler`: 77 78~~~ go 79type Handler interface { 80 ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) 81} 82~~~ 83 84Se 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: 85 86~~~ go 87func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { 88 // do some stuff before 89 next(rw, r) 90 // do some stuff after 91} 92~~~ 93 94E pode mapear isso para a cadeia de handler com a função `Use`: 95 96~~~ go 97n := negroni.New() 98n.Use(negroni.HandlerFunc(MyMiddleware)) 99~~~ 100 101Você também pode mapear `http.Handler` antigos: 102 103~~~ go 104n := negroni.New() 105 106mux := http.NewServeMux() 107// map your routes 108 109n.UseHandler(mux) 110 111n.Run(":3000") 112~~~ 113 114## `Run()` 115Negroni tem uma função de conveniência chamada `Run`. `Run` pega um endereço de string idêntico para [http.ListenAndServe](http://golang.org/pkg/net/http#ListenAndServe). 116 117~~~ go 118n := negroni.Classic() 119// ... 120log.Fatal(http.ListenAndServe(":8080", n)) 121~~~ 122 123## Middleware para Rotas Específicas 124Se 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. 125 126~~~ go 127router := mux.NewRouter() 128adminRoutes := mux.NewRouter() 129// add admin routes here 130 131// Criar um middleware negroni para admin 132router.Handle("/admin", negroni.New( 133 Middleware1, 134 Middleware2, 135 negroni.Wrap(adminRoutes), 136)) 137~~~ 138 139## Middleware de Terceiros 140 141Aqui está uma lista atual de Middleware Compatíveis com Negroni. Sinta se livre para mandar um PR vinculando seu middleware se construiu um: 142 143 144| Middleware | Autor | Descrição | 145| -----------|--------|-------------| 146| [Graceful](https://github.com/stretchr/graceful) | [Tyler Bunnell](https://github.com/tylerb) | Graceful HTTP Shutdown | 147| [secure](https://github.com/unrolled/secure) | [Cory Jacobsen](https://github.com/unrolled) | Implementa rapidamente itens de segurança.| 148| [binding](https://github.com/mholt/binding) | [Matt Holt](https://github.com/mholt) | Handler para mapeamento/validação de um request a estrutura. | 149| [logrus](https://github.com/meatballhat/negroni-logrus) | [Dan Buch](https://github.com/meatballhat) | Logrus-based logger | 150| [render](https://github.com/unrolled/render) | [Cory Jacobsen](https://github.com/unrolled) | Pacote para renderizar JSON, XML, e templates HTML. | 151| [gorelic](https://github.com/jingweno/negroni-gorelic) | [Jingwen Owen Ou](https://github.com/jingweno) | New Relic agent for Go runtime | 152| [gzip](https://github.com/phyber/negroni-gzip) | [phyber](https://github.com/phyber) | Handler para adicionar compreção gzip para as requisições | 153| [oauth2](https://github.com/goincremental/negroni-oauth2) | [David Bochenski](https://github.com/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. | 154| [sessions](https://github.com/goincremental/negroni-sessions) | [David Bochenski](https://github.com/bochenski) | Handler que provê o serviço de sessão. | 155| [permissions](https://github.com/xyproto/permissions) | [Alexander Rødseth](https://github.com/xyproto) | Cookies, usuários e permissões. | 156| [onthefly](https://github.com/xyproto/onthefly) | [Alexander Rødseth](https://github.com/xyproto) | Pacote para gerar TinySVG, HTML e CSS em tempo real. | 157 158## Exemplos 159[Alexander Rødseth](https://github.com/xyproto) criou [mooseware](https://github.com/xyproto/mooseware), uma estrutura para escrever um handler middleware Negroni. 160 161## Servidor com autoreload? 162[gin](https://github.com/codegangsta/gin) e [fresh](https://github.com/pilu/fresh) são aplicativos para autoreload do Negroni. 163 164## Leitura Essencial para Iniciantes em Go & Negroni 165* [Usando um contexto para passar informação de um middleware para o manipulador final](http://elithrar.github.io/article/map-string-interface/) 166* [Entendendo middleware](http://mattstauffer.co/blog/laravel-5.0-middleware-replacing-filters) 167 168 169## Sobre 170Negroni é obsessivamente desenhado por ninguém menos que [Code Gangsta](http://codegangsta.io/) 171