将响应头添加到每个处理程序而不重复同一行

我正在编写一个小型网站,对于每个页面,我都将服务器名称放在其标题中:


func httpSignUp(rw http.ResponseWriter, req *http.Request) {

    rw.Header().Set("Server", SERVER_NAME)

}

我想知道是否有一种方法可以设置 http.ResponseWriter 的默认服务器名称,这样我就不必一遍又一遍地使用同一行?


慕田峪7331174
浏览 160回答 3
3回答

慕村225694

创建一个包装器来设置标题:func wrap(h http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (         w.Header().Set("Server", SERVER_NAME)         h.ServeHTTP(w, r)    })}包装单个处理程序http.Handle("/path", wrap(aHandler)(http.Handle("/another/path", wrap(anotherHandler))或传递给 ListenAndServe 的根处理程序:log.Fatal(http.ListenAndServe(addr, wrap(rootHandler))

开心每一天1111

“喜欢组合而不是继承” - 4人帮继承根本就没有被设计到 Golang 中。;)如果您正在寻找有关原因部分的详细解释,我相信这已经在 SO 上得到了回答,因此我只想向您指出:在 Go 中嵌入而不是继承。嗯,您实际上可以使用适配器设计模式实现相同的结果,它使您能够从内置库扩展功能,对我来说,它的方式比继承更灵活。func adapter(h http.Handler) http.Handler {  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Server", SERVER_NAME)    h.ServeHTTP(w, r)  })}或者serverName作为参数传入:func adapter(h http.Handler, serverName string) http.Handler {  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {    w.Header().Set("Server", serverName)    h.ServeHTTP(w, r)  })}最后,您可以灵活选择要“继承”的处理程序:http.Handle("/path", adapter(your_handler))或者,如果它适用于每个处理程序,只需“继承”到根处理程序:http.ListenAndServe(port, adapter(root_Handler))

杨__羊羊

的http.ResponseWriter是interface,不是struct。所以,你不能直接扩展它。您需要扩展内部struct. 但这不是解决这个问题的惯用方法。您可以采取的一种方法是使用middleware. middleware只是一段将在您的主请求处理程序之前执行的代码,可用于执行一些常见任务。例如,使用middleware方法编写相同的东西:func injectServerHeader(handler http.Handler, serverName string) http.Handler {    ourFunc := func(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Server", serverName)        handler.ServeHTTP(w, r)    }    return http.HandlerFunc(ourFunc)}这样,您就可以使用中间件包装实际的 http 处理程序。因此,您不必一遍又一遍地编写相同的代码。例如:http.Handle("/some-path", injectServerHeader(aHandler))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go