我有一個通用的 Web 服務器,我想在不同的域/服務器上使用它。為了設定每個服務器,我只需讀取包含所有必要資訊的 JSON 組態檔。例如,對到達埠 80 的所有流量進行重定向并將其轉發到 TLS 服務。因為我不想使配置物件成為全域物件。如何將 inputFromConfigFile 中的內容傳遞給 redirectTLS 函式?
下面是一個例子:
func main(){
var inputFromConfigFile = "https://www.example.com:443"
go func() {
if err := http.ListenAndServe(":80", http.HandlerFunc(redirectTLS)); err != nil {
log.Fatalf("ListenAndServe error: %v", err)
}
}()
}
//Pass the above string to this function:
func redirectTLS(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "https://www.example.com:443" r.RequestURI,http.StatusMovedPermanently)
}
uj5u.com熱心網友回復:
您可以定義自定義處理程式(可以實作為結構體),只要它與 http.Handler 介面匹配即可。配置可以作為結構欄位保存在處理程式中。
type Handler struct {
// config goes here
}
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// anything that handler needs to do here
}
示例:https : //pkg.go.dev/net/http#example-Handle
uj5u.com熱心網友回復:
您可以redirectTLS直接在 main 中定義為行內閉包函式:
var inputFromConfigFile = "https://www.example.com:443"
go func() {
err := http.ListenAndServe(":80", func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, inputFromConfigFile r.RequestURI, http.StatusMovedPermanently)
})
if err != nil {
log.Fatalf("ListenAndServe error: %v", err)
}
}()
uj5u.com熱心網友回復:
我會將配置物件設為全域。
否則,您可以定義一個接受配置作為引數的函式,并回傳一個關閉配置物件的處理函式:
var inputFromConfigFile = "https://www.example.com:443"
http.ListenAndServe(":80", createHandler(inputFromConfigFile))
// ...
func createHandler(config string) http.HandlerFunc {
return http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, config r.RequestURI,http.StatusMovedPermanently)
})
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/373117.html
下一篇:如何在資料庫插入后取回行值?
