英文:
Passing a string to a handler function in Go
问题
我有一个通用的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)
}
}()
}
//将上述字符串传递给此函数:
func redirectTLS(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "https://www.example.com:443"+r.RequestURI,http.StatusMovedPermanently)
}
英文:
I have a generic Webserver which I want to use on different domains / servers.
For setting up each server I simply read a JSON config file with all necessary information. One would be for example the redirect for all traffic which reaches port 80 and forward it to a TLS service. Since I don't want to make the config object global. How can I pass the content from my inputFromConfigFile to the redirectTLS function?
Here is an example:
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)
}
答案1
得分: 3
你可以定义一个自定义的处理程序(可以实现为结构体),只要它符合http.Handler接口。配置可以保存在处理程序中作为结构字段。
type Handler struct {
// 配置放在这里
}
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// 处理程序需要执行的任何操作
}
示例:https://pkg.go.dev/net/http#example-Handle
英文:
You can define a custom Handler (could be implemented as a struct) as long as it matches the http.Handler interface. The config could be saved inside the Handler as a struct field.
type Handler struct {
// config goes here
}
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// anything that handler needs to do here
}
答案2
得分: 1
你可以直接在主函数中定义redirectTLS
作为内联闭包函数:
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)
}
}()
这段代码的作用是在主函数中定义一个闭包函数redirectTLS
,然后使用http.ListenAndServe
函数监听端口80,并在接收到请求时进行重定向。重定向的目标地址是从配置文件中获取的inputFromConfigFile
加上当前请求的URI。如果监听过程中出现错误,会使用log.Fatalf
函数输出错误信息并终止程序的执行。
英文:
You can define redirectTLS
as an inline closure function directly in 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)
}
}()
答案3
得分: 0
我会将配置对象设为全局变量。
否则,你可以定义一个接受配置作为参数并返回一个闭包函数的函数:
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)
})
}
英文:
I would make the config object global.
Otherwise, you can define a function that accepts the config as an argument, and returns a handler function that closes over the configuration object:
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)
})
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论