为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕田峪7331174 2022-01-04 10:06:56
我正在编写一个小型网站,对于每个页面,我都将服务器名称放在其标题中:func httpSignUp(rw http.ResponseWriter, req *http.Request) {    rw.Header().Set("Server", SERVER_NAME)}我想知道是否有一种方法可以设置 http.ResponseWriter 的默认服务器名称,这样我就不必一遍又一遍地使用同一行?
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

创建一个包装器来设置标题:


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))


查看完整回答
反对 回复 2022-01-04
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

“喜欢组合而不是继承” - 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))


查看完整回答
反对 回复 2022-01-04
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

的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))


查看完整回答
反对 回复 2022-01-04
  • 3 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号