【发布时间】:2020-08-26 09:31:06
【问题描述】:
我需要将GetAssetsCompute 函数封装在一个中间件中
r.Handle("/api/v1/assets/ComputeBlade", GetAssetsCompute(assetService)).Methods("GET")
func GetAssetsCompute(assetService ServiceType) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// stuff here
})
}
但因为中间件将 HTTP 处理程序作为参数,而我的函数不是处理程序,所以我不能。
我正在考虑做这样的事情。
func GetAssetsCompute(assetService ServiceType) http.Handler {
return MyMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// stuff here
}))
}
func MyMiddleware(next http.Handler) http.Handler {
}
这是正确的吗?或者有没有更好的方法来做到这一点。 同样在中间件内部,我需要访问 URL 端点,进行一些处理并存储这个处理后的值,然后再次在主处理程序中访问它。我该怎么做?
编辑:我想将此中间件仅应用于我拥有的端点的子集(>1)。不是全部
我还需要处理程序中GetAssetsCompute(assetService ServiceType) 函数中使用的assetService 变量。所以,我也需要这个闭包。
【问题讨论】:
-
当你说访问和存储“端点”是什么意思?如果您只是指请求路径,您可以使用
r.RequestURI在中间件和处理程序中获取它。 -
只是问一下,如果这仅适用于一个端点,为什么要将其实现为中间件?
-
这不是唯一一个。还有其他端点。但除了这些(我想使用中间件的那些)之外,还有一些我不想使用的端点。所以如果有
m端点,那么其中n使用这个中间件,其余m-n不要。 -
它变成了中间件预期功能的功能。如果它高度依赖于您的主处理程序正在做什么,那么将代码添加到主处理程序中可能比尝试构建中间件更有意义。中间件通常用于日志记录、身份验证、指标捕获等功能。这里它在一定程度上独立于主处理程序。
-
同意 praveent。我认为您有一些选择,具体取决于中间件/代码的确切功能。让我试着和他们中的一些人一起回答。