alice似乎是一个很好的中间件链接,我在这里尝试将它与httprouter一起使用,但只有外层/最后一个中间件被调用:
package main
import (
"fmt"
"github.com/julienschmidt/httprouter"
"github.com/justinas/alice"
"net/http"
"log"
"time"
)
func main() {
fmt.Println("started ", time.Now())
c := alice.New(S1, S2, S3).Then(nil)
router := httprouter.New()
router.Handler("GET", "/app", c)
http.ListenAndServe(":27007", router)
}
func S1(h http.Handler) http.Handler {
var x H1
return &x
}
func S2(h http.Handler) http.Handler {
var x H2
return &x
}
func S3(h http.Handler) http.Handler {
var x H3
return &x
}
type H1 struct{}
func (h *H1) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
log.Println("H1", time.Now())
}
type H2 struct{}
func (h *H2) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
log.Println("H2")
}
type H3 struct{}
func (h *H3) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
log.Println("H3")
}发布于 2015-02-24 01:48:39
您的中间件处理程序需要在准备好时调用下一个处理程序。未经测试的示例:
func S1(h http.Handler) http.Handler {
return &H1{next: h}
}
type H1 struct{
next http.Handler
}
func (h *H1) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
log.Println("H1", time.Now())
h.next.ServeHTTP(rw, req)
}或者:
func S1(next http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
log.Println("H1", time.Now())
next(rw, req)
})
}关于中间件的另一个例子,请看http://golang.org/src/net/http/server.go?s=37638:37688#L1280。
发布于 2015-02-24 05:27:02
向每个中间件传递一个您执行的http.Handler结构。这允许每个中间件不知道处理程序的顺序,它们只关心执行链中的下一个处理程序。顺序是在启动Alice时定义的。请参见:
https://stackoverflow.com/questions/28676536
复制相似问题