如何从gorilla mux.Router中过滤掉某些路径?

huangapple go评论91阅读模式
英文:

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!

huangapple
  • 本文由 发表于 2017年7月20日 17:57:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/45211395.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定