如何使用Gorilla Mux匹配整个路径与正则表达式

时间:2016-09-28 18:16:32

标签: go gorilla

我希望能够使用正则表达式来匹配整个路径而不仅仅是它的一部分。

例如:

/users.*

会匹配

/users
/users/bob
/users/bob/repos

目前使用Mux的HandleFunc,你必须匹配多条路径

/users
/users/{.*}
/users/{.*}/{.*}
...

1 个答案:

答案 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

去镇上!希望你们觉得这很有帮助。