在Go语言里,Negroni 是一个很地道的 web 中间件,它是微型,非嵌入式,并鼓励使用原生 net/http
处理器的库。
如果你用过并喜欢 Martini 框架,但又不想框架中有太多魔幻性的特征,那 Negroni 就是你的菜了,相信它非常适合你。
语言翻译:
当安装了 Go 语言并设置好了 GOPATH 后,新建你第一个.go
文件,我们叫它 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")
}
然后安装 Negroni 包(它依赖 Go 1.1 或更高的版本):
go get github.com/urfave/negroni
然后运行刚建好的 server.go 文件:
go run server.go
这时一个 Go net/http
Web 服务器就跑在 localhost:3000
上,使用浏览器打开 localhost:3000
可以看到输出结果。
如果你有问题或新想法,请到邮件群组里反馈,GitHub issues 是专门给提交 bug 报告和 pull 请求用途的,欢迎你的参与。
Negroni 不是一个框架,它是为了方便使用 net/http
而设计的一个库而已。
Negroni 没有带路由功能,使用 Negroni 时,需要找一个适合你的路由。不过好在 Go 社区里已经有相当多可用的路由,Negroni 更喜欢和那些完全支持 net/http
库的路由组合使用,比如,结合 Gorilla Mux 使用像这样:
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.Recovery
- 异常(恐慌)恢复中间件negroni.Logging
- 请求 / 响应 log 日志中间件negroni.Static
- 静态文件处理中间件,默认目录在 "public" 下.
negroni.Classic()
让你一开始就非常容易上手 Negroni ,并使用它那些通用的功能。
Negroni 提供双向的中间件机制,这个特征很棒,都是得益于 negroni.Handler
这个接口。
type Handler interface {
ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
}
如果一个中间件没有写入 ResponseWriter 响应,它会在中间件链里调用下一个 http.HandlerFunc
执行下去, 它可以这么优雅的使用。如下:
func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
// do some stuff before
next(rw, r)
// do some stuff after
}
你也可以用 Use
函数把这些 http.Handler
处理器引进到处理器链上来:
n := negroni.New()
n.Use(negroni.HandlerFunc(MyMiddleware))
你还可以使用 http.Handler
(s) 把 http.Handler
处理器引进来。
n := negroni.New()
mux := http.NewServeMux()
// map your routes
n.UseHandler(mux)
n.Run(":3000")
Negroni 提供一个很好用的函数叫 Run
,把地址字符串传人该函数,即可实现很地道的 http.ListenAndServe 函数功能了。
n := negroni.Classic()
// ...
log.Fatal(http.ListenAndServe(":8080", n))
如果你需要群组路由功能,需要借助特定的路由中间件完成,做法很简单,只需建立一个新 Negroni 实例,传人路由处理器里即可。
router := mux.NewRouter()
adminRoutes := mux.NewRouter()
// add admin routes here
// Create a new negroni for the admin middleware
router.Handle("/admin", negroni.New(
Middleware1,
Middleware2,
negroni.Wrap(adminRoutes),
))
以下的兼容 Negroni 的中间件列表,如果你也有兼容 Negroni 的中间件,可以提交到这个列表来交换链接,我们很乐意做这样有益的事情。
中间件 | 作者 | 描述 |
---|---|---|
RestGate | Prasanga Siripala | REST API 接口的安全认证 |
Graceful | Tyler Bunnell | 优雅关闭 HTTP 的中间件 |
secure | Cory Jacobsen | Middleware that implements a few quick security wins |
JWT Middleware | Auth0 | Middleware checks for a JWT on the Authorization header on incoming requests and decodes it |
binding | Matt Holt | HTTP 请求数据注入到 structs 实体 |
logrus | Dan Buch | 基于 Logrus-based logger 日志 |
render | Cory Jacobsen | 渲染 JSON, XML and HTML 中间件 |
gorelic | Jingwen Owen Ou | New Relic agent for Go runtime |
gzip | phyber | 响应流 GZIP 压缩 |
oauth2 | David Bochenski | oAuth2 中间件 |
sessions | David Bochenski | Session 会话管理 |
permissions2 | Alexander Rødseth | Cookies, 用户和权限 |
onthefly | Alexander Rødseth | 快速生成 TinySVG, HTML and CSS 中间件 |
cors | Olivier Poitrey | Cross Origin Resource Sharing (CORS) support |
xrequestid | Andrea Franz | 给每个请求指定一个随机 X-Request-Id 头的中间件 |
VanGoH | Taylor Wrobel | Configurable AWS-Style 基于 HMAC 鉴权认证的中间件 |
stats | Florent Messa | 检测 web 应用当前运行状态信息 (响应时间等等。) |
Alexander Rødseth 创建的 mooseware 是一个写兼容 Negroni 中间件的处理器骨架的范例。
gin 和 fresh 这两个应用是即时编译的 Negroni 工具,推荐用户开发的时候使用。
Negroni 由 Code Gangsta 主导设计开发完成