gpt4 book ai didi

http - 在 Go 中挂载双 http 路由器

转载 作者:行者123 更新时间:2023-12-02 02:18:43 29 4
gpt4 key购买 nike

我正在尝试安装 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返回404页面未找到。我正在尝试为特定子路径获取特定路由器,但这似乎不起作用。仅当我将其安装在根 / 上并让多路复用器路由器解析整个路径时,它才有效。理想情况下,我希望多路复用器路由器仅处理相对于其自身根的路径。这是可行的吗?

最佳答案

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,但适用相同的原理):Put http.NewServeMux into http.NewServeMux

关于http - 在 Go 中挂载双 http 路由器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66776243/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com