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路由

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