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-