gin路由

作者: xiaolv17 | 来源:发表于2021-07-24 08:33 被阅读0次

这篇文章我们来简单的讲讲gin的路由,举个简单的例子,运行下面代码的时候,路由是怎么走的呢。

r.GET("/hello", func(c *gin.Context) {
        // c.JSON:返回JSON格式的数据
        c.JSON(200, gin.H{
            "message": "Hello world!",
        })
    })

我们看到是get方法,里面传了一个请求地址参数,还有handler,然后看看Get的具体定义,其实主要还是routergroup.handle函数。

// GET is a shortcut for router.Handle("GET", path, handle).
func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
    return group.handle(http.MethodGet, relativePath, handlers)
}
func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes {
    absolutePath := group.calculateAbsolutePath(relativePath)
    handlers = group.combineHandlers(handlers)
    group.engine.addRoute(httpMethod, absolutePath, handlers)
    return group.returnObj()
}

group.calculateAbsolutePath():参数是请求定义的相对路由,根据group.basePath计算出到达该请求的绝对路径。比如group.basePath的值是"/",relativePath是"/hello",那么返回就是"/hello",但如果group.basePath是"/aa",relativePath是“../bb/cc”,那么返回结果就是"/bb/cc"

func (group *RouterGroup) calculateAbsolutePath(relativePath string) string {
    return joinPaths(group.basePath, relativePath)
}
func joinPaths(absolutePath, relativePath string) string {
    if relativePath == "" {
        return absolutePath
    }

    finalPath := path.Join(absolutePath, relativePath)
    if lastChar(relativePath) == '/' && lastChar(finalPath) != '/' {
        return finalPath + "/"
    }
    fmt.Println(finalPath)
    return finalPath
}

返回的是一个从一开始在RouterGroup定义的basePath的绝对路径,group.combineHandlers(handlers)就是将目标请求的handler加到handlers 的数组中,然后返回最新的handers,最后将请求路径和对应的handers加到请求树中,而树也是gin路由比较关键的地方。我会从下篇文章开始举几个例子来说明。

上面内容,如果有错误或者不正确的地方,请大家留言不吝赐教,谢谢。

相关文章

  • Gin: implementation of route

    Gin 框架路由实现

  • gin框架总结

    gin框架总结 一 gin框架初识 1.1 helloworld gin框架中的路由是基于httprouter[h...

  • 分享一波gin的路由算法分享

    [TOC] gin的路由算法分享 gin是什么呢? 我们在github上看看官方简介 Gin is a web f...

  • gin路由

    这篇文章我们来简单的讲讲gin的路由,举个简单的例子,运行下面代码的时候,路由是怎么走的呢。 我们看到是get方法...

  • Gin框架路由

    介绍 Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点对...

  • fastapi路由管理

    fastapi路由管理,和GIN的框架思想一致。入口函数----主路由---控制器---服务 main入口函数,需...

  • Gin(二):使用路由

    更多文章 狂点ISLAND Gin(二):路由 经过上一章节的介绍,搭建一个简单的 Gin web 项目非常容易,...

  • middleware gin-contrib/cors 在 30

    背景:gin 配置了路由 router.GET("/api/users") , 添加了 cors 中间件,但是访问...

  • gin路由例子1

    上篇文章说将请求加入树中是比较关键的,现在我们开始举第一个例子说明。 这个是最简单的例子,很多文章写gin的使用都...

  • go-gin框架初探

    gin框架初探 参数req的获取、修改、封装 路由定义(底层结构:前缀树) 全局中间件、路由中间件 run的几种方...

网友评论

      本文标题:gin路由

      本文链接:https://www.haomeiwen.com/subject/wbpmmltx.html