我希望能够使用正则表达式来匹配整个路径而不仅仅是它的一部分。
例如:
/users.*
会匹配
/users
/users/bob
/users/bob/repos
目前使用Mux的HandleFunc
,你必须匹配多条路径
/users
/users/{.*}
/users/{.*}/{.*}
...
答案 0 :(得分:0)
我最终编写了自己的自定义匹配器功能并使用了go的正则表达式包。这很容易做,这是一个例子:
import (
...
"net/http"
"net/url"
"regexp"
"github.com/gorilla/mux"
...
)
...
muxRouter := mux.NewRouter()
muxRouter.
Methods("GET", "POST").
Schemes("https").
MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
match, _ := regexp.MatchString("/users.*", r.URL.Path)
// TODO handle error from regex
return match
}).
HandlerFunc(m.ServeHTTP)
关键是使用:
HandlerFunc(f func(http.ResponseWriter, *http.Request))
而不是:
HandleFunc(path string, f func(http.ResponseWriter, *http.Request))
。
HandlerFunc
必须在您的匹配之后。这将允许您编写自己的自定义匹配器功能。
<强>性能强>
对于我的用例,这表现良好,但如果您想要更好的性能,可以尝试使用预编译的r, _ := regexp.Compile("p([a-z]+)ch")
。
您可能需要使用一个f func(http.ResponseWriter, *http.Request)
的结构,该结构已经存储在结构中的预编译正则表达式模式。
Go Regex示例:
https://gobyexample.com/regular-expressions
去镇上!希望你们觉得这很有帮助。