为了账号安全,请及时绑定邮箱和手机立即绑定

大猩猩/多路复用器嵌套路由不匹配

大猩猩/多路复用器嵌套路由不匹配

Go
沧海一幻觉 2022-08-15 15:54:50
我不确定为什么我的路线不匹配。 匹配,我得到预期的输出,但不是。当我尝试在浏览器上进行匹配时,我得到了。localhost:8000localhost:8000/admin/test404/admin/test我想以这种方式组织我的代码,因为我想在每个.package项目结构/admin  admin.gomain.gomain.gopackage mainimport (    "example.com/liondancer/playground/admin"    "fmt"    "github.com/gorilla/mux"    "log"    "net/http")func handler(w http.ResponseWriter, r *http.Request) {    fmt.Fprintf(w, "Hi there!")}func main() {    r := mux.NewRouter()    r.HandleFunc("/", handler)    r.PathPrefix("/admin").Handler(admin.NewHandler())    log.Fatal(http.ListenAndServe(":8000", r))}admin.gopackage adminimport (    "fmt"    "net/http"    "github.com/gorilla/mux")type Handler struct {    router *mux.Router}func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {    h.router.ServeHTTP(w, r)}func NewHandler() *Handler {    h := &Handler{}    r := mux.NewRouter()    h.router = r    h.addRoutes()    return h}func (h *Handler) addRoutes() {    fmt.Print("hi here"). // <--- printed here to prove func gets ran.    h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {        w.WriteHeader(http.StatusOK)        fmt.Fprintf(w, "test")    })}
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

嵌套处理程序永远不会匹配,因为您没有删除早期处理程序的 URL 前缀。快速修复以显示我的意思:


// h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {


// quick fix

h.router.HandleFunc("/admin/test", func(w http.ResponseWriter, r *http.Request) {

显然,您希望嵌套处理程序不知道它的嵌套方式,因此在注册子处理程序时,请去除 URL 前缀,以便您的子处理程序匹配:


// r.PathPrefix("/admin").Handler(admin.NewHandler())


// better

r.PathPrefix("/admin/").Handler(

    http.StripPrefix(

        "/admin",

        admin.NewHandler(),

    ),

)


查看完整回答
反对 回复 2022-08-15
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

我能够使用.以下是大猩猩Mux中嵌套子路由的用法示例的链接Subrouter()Subrouter()


func main() {

    r := mux.NewRouter()

    r.HandleFunc("/", handler)

    r.PathPrefix("/admin").Subrouter().HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {

        w.WriteHeader(http.StatusOK)

        fmt.Fprintf(w, "test")

    })

    log.Fatal(http.ListenAndServe(":8000", r))

}

如果你想把它分成另一个文件,你也可以这样做:


func main() {

    r := mux.NewRouter()

    r.HandleFunc("/", handler)

    subRoute := r.PathPrefix("/admin").Subrouter()

    NewHandler(subRoute)

    log.Fatal(http.ListenAndServe(":8000", r))

}


func NewHandler(r* mux.Router) *Handler {

    h := &Handler{}

    h.router = r

    h.AddRoutes()

    return h

}


func (h *Handler) AddRoutes() {

    fmt.Print("hi here") // <--- printed here to prove func gets ran.

        h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {

        w.WriteHeader(http.StatusOK)

        fmt.Fprintf(w, "test")

    })

}


查看完整回答
反对 回复 2022-08-15
  • 2 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信