gin路由

2021-07-24  本文已影响0人  xiaolv17

这篇文章我们来简单的讲讲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路由比较关键的地方。我会从下篇文章开始举几个例子来说明。

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

上一篇下一篇

猜你喜欢

热点阅读