为什么使用此适配器接口模式会出现无限循环

时间:2019-08-19 19:40:34

标签: go adapter mux

我需要用考虑到传入的Auth令牌并为传出的服务调用发布机器对机器的令牌的接口替换现有的API接口。

总而言之,这是一个使用大猩猩/ mux路由框架的API,我只是将端点添加到mux.NewRouter()。没什么幻想的。。。

我一直在尝试几种不同的模式,但是似乎最吸引人的模式是Mat Ryer在https://medium.com/@matryer/writing-middleware-in-golang-and-how-go-makes-it-so-much-fun-4375c1246e81https://go-talks.appspot.com/github.com/matryer/golanguk/building-apis.slide#30中衍生的适配器接口

总而言之,没有直接逻辑,我做了以下事情,当我从Postman运行端点时陷入无限循环。

  

{“ level”:“ info”,“ msg”:“ New Relic Checkpoint !!!   / endpoint“,” time“:” 2019-08-19T14:28:27-05:00“}   {“ level”:“ info”,“ msg”:“安全检查点!!!   / endpoint“,” time“:” 2019-08-19T14:28:27-05:00“}   {“ level”:“ info”,“ msg”:“标头检查点!!!   / endpoint“,” time“:” 2019-08-19T14:28:27-05:00“}   {“ level”:“ info”,“ msg”:“ New Relic Checkpoint!   / endpoint“,” time“:” 2019-08-19T14:28:27-05:00“}   {“ level”:“ info”,“ msg”:“安全检查点!!!   / endpoint“,” time“:” 2019-08-19T14:28:27-05:00“}   {“ level”:“ info”,“ msg”:“标头检查点!!!   / endpoint“,” time“:” 2019-08-19T14:28:27-05:00“}

r.Handle(endpoint.Path(), Adapt(r, NewRelicAdapter(endpoint), SecurityAdapter(endpoint), WithHeader(endpoint)))

适配器接口如下建立...

type Adapter func(http.Handler) http.Handler

func Adapt(h http.Handler, adapters ...Adapter) http.Handler {
    for _, adapter := range reverseAdapters(adapters) {
        h = adapter(h)
    }
    return h
}

func NewRelicAdapter(endpoint rest.Endpoint) Adapter {
    return func(h http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            logrus.Infof("New Relic Checkpoint!!! %v", endpoint.Path())
            h.ServeHTTP(w, r)
        })
    }
}

func SecurityAdapter(endpoint rest.Endpoint) Adapter {
    return func(h http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            logrus.Infof("Security Checkpoint!!! %v", endpoint.Path())
            h.ServeHTTP(w, r)
        })
    }
}

func WithHeader(endpoint rest.Endpoint) Adapter {
    return func(h http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            logrus.Infof("Header Checkpoint!!! %v", endpoint.Path())
            h.ServeHTTP(w, r)
        })
    }
}

func reverseAdapters(adapters []Adapter) []Adapter {
    for i := 0; i < len(adapters)/2; i++ {
        j := len(adapters) - i - 1
        adapters[i], adapters[j] = adapters[j], adapters[i]
    }
    return adapters
}

在了解每个适配器将要执行的详细信息之前,我非常感谢知道为什么会这样循环。

1 个答案:

答案 0 :(得分:0)

认为这是因为您的处理程序链以r结尾,实际上变成了:

r.Handle(path, r)

您必须在某个地方有一个实际的处理程序来处理该呼叫,因此您的设置应如下所示:

r.Handle(path, Adapt(theHandler, adapter1, adapter2, adapter3))

但是,由于您说过您正在使用大猩猩/多路复用器,因此还有另一种方法。看看Router.Use

https://godoc.org/github.com/gorilla/mux#Router.Use