亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將響應頭添加到每個處理程序而不重復同一行

將響應頭添加到每個處理程序而不重復同一行

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 關注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號