我需要用考虑到传入的Auth令牌并为传出的服务调用发布机器对机器的令牌的接口替换现有的API接口。
总而言之,这是一个使用大猩猩/ mux路由框架的API,我只是将端点添加到mux.NewRouter()。没什么幻想的。。。
我一直在尝试几种不同的模式,但是似乎最吸引人的模式是Mat Ryer在https://medium.com/@matryer/writing-middleware-in-golang-and-how-go-makes-it-so-much-fun-4375c1246e81和https://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
}
在了解每个适配器将要执行的详细信息之前,我非常感谢知道为什么会这样循环。
答案 0 :(得分:0)
我认为这是因为您的处理程序链以r结尾,实际上变成了:
r.Handle(path, r)
您必须在某个地方有一个实际的处理程序来处理该呼叫,因此您的设置应如下所示:
r.Handle(path, Adapt(theHandler, adapter1, adapter2, adapter3))
但是,由于您说过您正在使用大猩猩/多路复用器,因此还有另一种方法。看看Router.Use