为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
qq_笑_17 2022-11-08 15:51:06
在我的情况下,需要捕获请求并检查是否是内部请求。如果不是,则将这些请求重定向到其他处理函数。网址示例:1. URL: http://localhost/internal/dosomething12. URL: http://localhost/internal/dosomething2/:id3. URL: http://localhost/overview4. 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这种情况有更好的解决方案吗?
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

使用子引擎。

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"


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信