给定一个带有签名的中间件函数:
func Middleware(handler http.Handler) http.Handler
如何设置响应标头并从调用函数传递给它?
首先使用一些响应头初始化HandlerFunc(" base"或主服务器功能)。然后以传统方式将其传递给中间件函数并进行包装。
如何从handler
参数中获取响应及其标题?
我已经尝试了很多东西,但无法获得标题值。
答案 0 :(得分:3)
严格来说,你不能。在原则中,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)
}
}
此功能"装饰"通过返回实现自定义逻辑的 new 处理程序并在某个时刻调用原始(包装)处理函数,将原始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")
}
}