在 Go 中挂载双 http 路由器
Mount double http routers in Go
我正在尝试安装 2 个 http 路由器,例如:
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
r := mux.NewRouter()
r.HandleFunc("/foo", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hi, %q", html.EscapeString(r.URL.Path))
})
http.Handle("/subpath", r)
log.Fatal(http.ListenAndServe(":8080", nil))
不过/subpath/foo
returns404 page not found
。
我正在尝试为特定子路径获取特定路由器,但这似乎不起作用。
只有当我将它安装在根 /
上并让 mux 路由器解析整个路径时,它才有效。理想情况下,我希望 mux 路由器只处理相对于它自己的根的路径。可行吗?
2 件事。
首先,您必须为以斜杠结尾的路径注册“子路由器”:/subpath/
,否则只有 /subpath
路径会被路由到它,而不是完整的子树。
其次,您的 r
路由器将 /foo
路径路由到已注册的函数,但实际路径将是 /subpath/foo
,与 /foo
不匹配,因此它将不会被路由到它。您必须去掉 /subpath
前缀。
工作代码:
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
r := mux.NewRouter()
r.HandleFunc("/foo", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hi, %q", html.EscapeString(r.URL.Path))
})
http.Handle("/subpath/", http.StripPrefix("/subpath", r))
log.Fatal(http.ListenAndServe(":8080", nil))
编辑:我想我发现了一个可能的副本(它使用标准库的 ServeMux
,但同样的原则适用):
我正在尝试安装 2 个 http 路由器,例如:
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
r := mux.NewRouter()
r.HandleFunc("/foo", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hi, %q", html.EscapeString(r.URL.Path))
})
http.Handle("/subpath", r)
log.Fatal(http.ListenAndServe(":8080", nil))
不过/subpath/foo
returns404 page not found
。
我正在尝试为特定子路径获取特定路由器,但这似乎不起作用。
只有当我将它安装在根 /
上并让 mux 路由器解析整个路径时,它才有效。理想情况下,我希望 mux 路由器只处理相对于它自己的根的路径。可行吗?
2 件事。
首先,您必须为以斜杠结尾的路径注册“子路由器”:/subpath/
,否则只有 /subpath
路径会被路由到它,而不是完整的子树。
其次,您的 r
路由器将 /foo
路径路由到已注册的函数,但实际路径将是 /subpath/foo
,与 /foo
不匹配,因此它将不会被路由到它。您必须去掉 /subpath
前缀。
工作代码:
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
r := mux.NewRouter()
r.HandleFunc("/foo", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hi, %q", html.EscapeString(r.URL.Path))
})
http.Handle("/subpath/", http.StripPrefix("/subpath", r))
log.Fatal(http.ListenAndServe(":8080", nil))
编辑:我想我发现了一个可能的副本(它使用标准库的 ServeMux
,但同样的原则适用):