Go 如何从处理程序类型获取响应头?
给定一个具有以下签名的中间件函数:Go 如何从处理程序类型获取响应头?,go,Go,给定一个具有以下签名的中间件函数: func Middleware(handler http.Handler) http.Handler 如何设置响应头并从调用函数传递给它 首先,使用一些响应头初始化HandlerFunc(“基本”或主服务器函数)。然后以传统的方式将其传递给中间件函数并由其包装 如何从处理程序参数中获取响应及其标题 我已经尝试了很多方法,但无法获取标题值。严格来说,您不能。在原理中,http.Handler是为每个请求调用的函数。因此,它不受任何特定请求的约束;它将被重新用于
func Middleware(handler http.Handler) http.Handler
如何设置响应头并从调用函数传递给它
首先,使用一些响应头初始化HandlerFunc(“基本”或主服务器函数)。然后以传统的方式将其传递给中间件函数并由其包装
如何从处理程序
参数中获取响应及其标题
我已经尝试了很多方法,但无法获取标题值。严格来说,您不能。在原理中,
http.Handler
是为每个请求调用的函数。因此,它不受任何特定请求的约束;它将被重新用于任意数量的请求。因此,无法从现有的HTTP.Handler
对象检索HTTP请求或响应头
但是,您可以使用自己的中间件来修饰处理程序,以访问中间件函数设置的HTTP响应头
您的问题中描述的中间件功能通常会这样实现:
func Middleware(originalHandler http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
// call the original handler that is wrapped by this middleware
originalHandler.ServeHTTP(rw, req)
}
}
此函数“装饰”原始的http.Handler
,该处理程序作为参数传递到中间件函数中,方法是返回一个实现自定义逻辑的新处理程序,并在某个点调用原始(包装的)处理程序函数
在新函数中,您可以像往常一样访问
http.ResponseWriter
对象,以访问已由修饰处理程序设置的http头:
func Middleware(originalHandler http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
// Add new headers to the response...
rw.Header().Set("X-My-Own-Header", "foo")
// ...or access data from the original request
fmt.Println(req.Header().Get("X-My-Request-Header")
// call the original handler that is wrapped by this middleware
originalHandler.ServeHTTP(rw, req)
// Access headers in the response object
rw.Header().Get("X-Header-Set-By-Middleware")
}
}
我确信有一种方法可以从包装好的处理程序中获取原始响应(和标题),但我还没有弄清楚如何获得这些响应。@sexlAuthor,正如我所说,处理程序本身与任何类型的请求都没有关联(如果你看一下,你会发现
http.Handler
接口除了ServeHTTP
方法之外没有提供太多功能)。我想在回答中表达的想法是,你可以自己包装处理程序,然后在调用包装处理程序函数之前在自己的中间件中访问原始请求。“访问修饰处理程序已经设置的HTTP头”实际上就是我要做的,也就是说,获取由originalHandler
设置的响应头,然后在Middleware()中处理它们,在原始响应上设置额外的头,最后调用ServeHTTP.Middleware()现在装饰原始的http.Handler
,它将返回一个新的HandlerFunc
,如您上面所述。您需要装饰ResponseWriter-