golang mux,路由通配符和自定义功能匹配

the*_*hai 6 go mux

我正在使用mux包,它似乎运行得很好,除了它似乎不支持复杂的路由或至少我不知道它是如何做的.我有以下几条路线:

router := mux.NewRouter()
router.HandleFunc("/{productid}/{code}", product)
router.HandleFunc("/{user}", userHome)
router.HandleFunc("/search/price", searchPage)
Run Code Online (Sandbox Code Playgroud)

所以我有两个问题:

  • 如何定义/ search/price/*这样的通配符路由,以便/ search/price/29923/rage/200/color = red等请求可以匹配?

  • 是否可以向现有路线添加自定义条件?例如,如果路由是/{productid}/{code}和函数x返回true,请使用此handlerTrue,如果它返回falseuse handlerFalse.

我试图添加类似.MatcherFunc(myfunction(ip)bool)路线的东西 ,但它抱怨路由器没有这样的方法.

目前我正处理处理程序内的"自定义"条件.

Ton*_*nas 9

你可以使用regexp.就像是

router.HandleFunc(`/search/price/{rest:[a-zA-Z0-9=\-\/]+}`, searchPage)
Run Code Online (Sandbox Code Playgroud)

这样,rest只会抓住一切,所以在你的例子rest29923/rage/200/color=red.您需要在代码中解析它.

不过,你可能想要一些像可选参数.

router.HandleFunc(`/search{price:(\/price\/[0-9]+)?}{rage:(\/rage\/[0-9]+)?}{color:(\/color=[a-z]+)?}`, searchPage)
Run Code Online (Sandbox Code Playgroud)

在那之后,你得到变量price = "/price/29923",rage = "/rage/200"并且color = "/color=red"你仍然需要解析,但它更容易,你可以控制哪些参数是有效的.如果你跳过一些参数,它会按预期工作,例如./search/price/29923/color=red只会给出一个空rage变量,但仍然匹配.

我不太明白你的第二个问题.


eli*_*rar 0

我不太确定您是否需要一条“通配符”路线:您只需要一条具有多个参数的路线:

/search/price/{price}/rage/{id}/color将会起作用,请注意查询字符串不需要包含在匹配器中(您可以通过 访问这些字符串request.URL.Query,而可以通过 访问 mux 变量mux.Vars。您还可以使用正则表达式来缩小可接受的参数范围。

它还将有助于区分您的用户和产品路线,也许可以通过在它们前面加上/user/{id}and前缀/products/{id}/{code}(特别是对于语义)。

就目前而言MatcherFunc,您需要确保您的函数使用与 MatcherFunc (这是一种类型)相同的签名:func MatchIPAddresses(*http.Request, *RouteMatch) bool可以解决它。如果您希望使用代理,您可以通过检查或 来通过Request结构访问 IP 地址。我通常会检查两者是否有一个为空 ( )。r.RemoteAddrr.Header.Get("X-Forwarded-For")""

即(粗略;你可以清理一下!)

func MatchIPAddresses(r *http.Request, rm *RouteMatch) bool {
    if r.RemoteAddr == 8.8.8.8 {
        return true
    } else if r.Header.Get("X-Forwarded-For") == 8.8.8.8 {
        return true
    }

    return false
}
Run Code Online (Sandbox Code Playgroud)