英文:
How to filter some path from gorilla mux.Router
问题
我想要从mux.Router中匹配一些路由,并对其他所有路由使用相同的处理程序。我该如何做到这一点?
例如:有以下路径:
/general/baz/bro
/general/foo/bar
/general/unknown
我想要将第一个路径与特定的处理程序匹配,将其他所有路径与默认处理程序匹配。
我尝试了以下代码,但没有成功:
r.Methods("GET").PathPrefix("/general").Handler(defaultHandler)
r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler)
我期望bazBroHandler处理"/general/baz/bro"路径,defaultHandler处理所有以"/general"开头的其他路径。
英文:
I would like to match only some routes from a mux.Router, and use the same handler for all the others. How can I do this?
i.e.: having these paths:
/general/baz/bro
/general/foo/bar
/general/unknown
I would like to match the first with a specific handler, and all the others with a default handler.
I've tried with no success something like:
r.Methods("GET").PathPrefix("/general").Handler(defaultHandler)
r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler)
I was expecting the bazBroHandler handling the /general/baz/bro
path, and the defaultHandler all the other starting with /general
答案1
得分: 0
一种实现这个的方法是使用MatcherFunc。在MatcherFunc
中,比较/验证传入的请求Path
,例如:
// 默认处理程序
r.MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
return r.URL.Path != "/general/baz/bro" && strings.HasPrefix(r.URL.Path, "/general") && r.Method == "GET"
}).Handler(defaultHandler)
// 特定处理程序
r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler)
英文:
One way to achieve this is by using MatcherFunc. In the MatcherFunc
, compare/verify the incoming request Path
, i.e.:
//Default handler
r.MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
return r.URL.Path != "/general/baz/bro" && strings.HasPrefix(r.URL.Path, "/general") && r.Method == "GET"
}).Handler(defaultHandler)
//Specific handler
r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler)
答案2
得分: 0
最后我意识到我需要倒转顺序:
r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler)
r.Methods("GET").PathPrefix("/general").Handler(defaultHandler)
现在一切都正常工作了!
英文:
In the end I've just realized that I needed to invert the order:
r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler)
r.Methods("GET").PathPrefix("/general").Handler(defaultHandler)
now everything is working!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论