亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

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 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號