这篇文章我们来简单的讲讲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路由比较关键的地方。我会从下篇文章开始举几个例子来说明。
上面内容,如果有错误或者不正确的地方,请大家留言不吝赐教,谢谢。
网友评论