中间件不被“alice”调用

时间:2015-02-23 14:55:13

标签: web-applications go middleware

为什么此处仅调用ServeHTTP的{​​{1}}方法,而H1H2的方法似乎被忽略了?

alice似乎是一个很好的中间件链接,在这里我尝试将它与httprouter一起使用,但只有外部/最后一个中间件被调用:

H3

2 个答案:

答案 0 :(得分:1)

您的中间件处理程序需要在准备好时调用下一个处理程序。未经测试的例子:

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以获取中间件的另一个示例。

答案 1 :(得分:0)

每个中间件都会传递您执行的http.Handler结构。这允许每个中间件不知道处理程序的顺序,并且它们只关心简单地执行链中的下一个。订单在您启动Alice时定义。参见: