关于 Negroni 中间件
在Go语言里,Negroni 是一个很地道的 web 中间件,它是微型,非嵌入式,并鼓励使用原生 net/http 处理器的库。
如果你用过并喜欢 Martini 框架,但又不想框架中有太多魔幻性的特征,那 Negroni 就是你的菜了,相信它非常适合你。
语言翻译:
入门指导
当安装了 Go 语言并设置好了 GOPATH 后,新建你第一个.go 文件,我们叫它 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, "Welcome to the home page!")
}) n := negroni.Classic()
n.UseHandler(mux)
n.Run(":3000")
}
然后安装 Negroni 包(它依赖 Go 1.1 或更高的版本):
go get github.com/codegangsta/negroni
然后运行刚建好的 server.go 文件:
go run server.go
这时一个 Go net/http Web 服务器就跑在 localhost:3000 上,使用浏览器打开 localhost:3000 可以看到输出结果。
需要帮助吗?
如果你有问题或新想法,请到 邮件群组 里反馈,GitHub issues 是专门给提交 bug 报告和 pull 请求用途的。
Negroni 是一个框架吗?
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.Classic() 提供一些默认的中间件,这些中间件在多数应用都很有用。
- negroni.Recovery - 异常(恐慌)恢复中间件
- negroni.Logging - 请求 / 响应 log 日志中间件
- negroni.Static - 静态文件处理中间件,默认目录在 "public" 下.
negroni.Classic() 让你一开始就非常容易上手 Negroni ,并使用它那些通用的功能。
Handlers (处理器)
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")
Run()
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 工具,推荐用户开发的时候使用。
Go & Negroni 初学者必读推荐
关于
Negroni 由 Code Gangsta 主导设计开发完成
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。