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(),
),
)
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")
})
}
- 2 回答
- 0 关注
- 78 浏览
添加回答
举报