如何在使用 router.Any 和通配符处理请求后保留路径参数

在我的情况下,需要捕获请求并检查是否是内部请求。如果不是,则将这些请求重定向到其他处理函数。


网址示例:


1. URL: http://localhost/internal/dosomething1

2. URL: http://localhost/internal/dosomething2/:id

3. URL: http://localhost/overview

4. URL: http://localhost/xxx

只有以开头的 URIinternal应该在我自己的句柄函数中处理(案例 1 和 2)。


具有任何请求方法的其他人将代理到另一个函数(案例 3 和 4)。


我正在尝试这样使用router.Any("/*uri", handlerExternal):


func handlerExternal(c *gin.Context) {

    path := c.Param("uri")

    if strings.HasPrefix(path, "/internal/") {


        uri := strings.Split(path, "/")

        switch uri[2] {

        case "dosomething1":

            doInternal(c)

        }

    } else {

        doExternal(c)

    }

}

但是使用此解决方案,doInternal(c)无法捕获路径参数,:id如http://localhost/internal/dosomething2/:id


这种情况有更好的解决方案吗?


qq_笑_17
浏览 67回答 1
1回答

温温酱

使用子引擎。gin.New您可以仅使用内部路由实例化引擎而不运行它。相反,您将上下文从您的Any路线传递到Engine.HandleContext.这将从主引擎传递上下文,并将根据子路由中的占位符匹配路径参数。您可以像往常一样在子引擎上声明路由:func main() {    internalEngine := gin.New()    internalEngine.GET("/internal/dosomething1", func(c *gin.Context) { c.JSON(200, "ok") })    internalEngine.GET("/internal/dosomething2/:id", func(c *gin.Context) { c.JSON(200, c.Param("id")) })    mainEngine := gin.New()    mainEngine.Any("/*uri", func(c *gin.Context) {        path := c.Param("uri")        if strings.HasPrefix(path, "/internal/") {            uri := strings.Split(path, "/")            switch uri[2] {            case "dosomething1", "dosomething2":                internalEngine.HandleContext(c)            }        } else {            doExternal(c)        }    })    mainEngine.Run(":8800")}您还可以c.Request.URL.Path在将上下文中继到子引擎之前进行修改,例如internal,如果您愿意,可以删除前缀。现在,如果您尝试 GET 请求:http://localhost:8855/internal/dosomething2/1234它将回显输出:"1234"
打开App,查看更多内容
随时随地看视频慕课网APP