web-applications - `alice` 未调用中间件

标签 web-applications go middleware

为什么这里只调用了 H1ServeHTTP 方法,而 H2H3 似乎是被忽略了?

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")
}

最佳答案

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

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中间件的另一个例子。

关于web-applications - `alice` 未调用中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28676536/

相关文章:

c# - 在 ASP .Net Core 中的 ExceptionFilterAttribute 中添加响应 header

java - 如何在axis生成的客户端中实现线程以使用java向web服务发出多个请求

java - 使用 f 转换时间时出现日期错误 :convertDateTime

database - "Web Development with Clojure": No such var: db/get-user

java - JSON数据问题

go - 简明地深复制一片?

android - 防止android在webapp中休眠

inheritance - golang 关注点分离与可用性

go - JOIN 使用 sqlx 导致 'missing destination name'

php - Laravel 中间件在设置为全局中间件时不起作用