如何从Handler类型获取响应头?

时间:2016-01-02 18:48:57

标签: go

给定一个带有签名的中间件函数:

func Middleware(handler http.Handler) http.Handler

如何设置响应标头并从调用函数传递给它?

首先使用一些响应头初始化HandlerFunc(" base"或主服务器功能)。然后以传统方式将其传递给中间件函数并进行包装。

如何从handler参数中获取响应及其标题?

我已经尝试了很多东西,但无法获得标题值。

1 个答案:

答案 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")
    }
}