如何使用 Gorilla Mux 进行 URL 匹配?

Posted

技术标签:

【中文标题】如何使用 Gorilla Mux 进行 URL 匹配?【英文标题】:How to use Gorilla Mux for URL matching? 【发布时间】:2020-03-10 07:43:18 【问题描述】:

我有一个验证器函数来检查给定路径是否与路径数组中的路径匹配。

当前逻辑:

var allowed := String"/users", "/teams"
func Validator(path String) bool 
   for _, p := range allowed 
     if path == p 
        return true
     
   
   return false

我想用 golang gorilla mux 替换它,因为我可能有路径变量。 mux 的 github 存储库说“HTTP 路由器和 URL 匹配器”。但是,没有关于如何使用它进行 URL 匹配的示例。

【问题讨论】:

url 匹配是由路由器完成的,它是为了路由而不是验证。为了您的方便,gorilla/mux 不提供独立的匹配器。您要么使用 mux.Router 将 http 请求路由到特定的处理程序,要么不使用。如果你只需要一个验证器,而不是路由器,那么不要使用 gorilla/mux。 这能回答你的问题吗? golang mux, routing wildcard & custom func match @SahithVibudhi 说,如果你仍然想使用 gorilla/mux(请不要)然后看看 mux.Router.Match 方法,正如你所看到的,因为这是一个 http request router 参数必须是一个http请求,所以如果你想使用它,你需要将你想要验证的路径变成一个请求。 我用类似的方法解决了。我必须验证/users/id 之类的路径,以检查开发人员令牌是否可以访问此端点。我不想重写逻辑,而是想重新使用 mux 的“URL 匹配器”。因为它附带一个。 @ifnotak 不能解决问题。我已经添加了答案。 【参考方案1】:

这是我通过代码解决它的方法:

// STEP 1: create a router
router := mux.NewRouter()

// STEP 2: register routes that are allowed
router.NewRoute().Path("/users/id").Methods("GET")
router.NewRoute().Path("/users").Methods("GET")
router.NewRoute().Path("/teams").Methods("GET")

routeMatch := mux.RouteMatch

// STEP 3: create a http.Request to use in Mux Route Matcher
url := url.URL  Path: "/users/1" 
request := http.Request Method:"GET", URL: &url 

// STEP 4: Mux's Router returns true/false
x := router.Match(&request, &routeMatch)
fmt.Println(x) // true

url = url.URL  Path: "/other-endpoint" 
request = http.Request Method:"GET", URL: &url 

x = router.Match(&request, &routeMatch)
fmt.Println(x) // false

【讨论】:

以上是关于如何使用 Gorilla Mux 进行 URL 匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gorilla mux 路由中获取 OR 模式

gorilla/mux 的学习

使用httputil和gorilla / mux反向代理

使用 Gorilla Mux 和 CockroachDB 编写可维护 RESTful API

如何组织 gorilla mux 路线?

Gorilla Mux 和 GORM 失败