GEE 基本框架篇 – 路由篇之RouterGroup
详细可查看https://github.com/OddSpilit/gee/routerGroup.go 源码
- 通常我们都会需要把路由做一个分组,让注册的路由属于某个组的情况。这块代码有router基础的情况下是非常好实现的,现在我们来进入正题🧑🔧
RouterGroup
- 我们先来看看RouterGroup的结构体以及其方法
-
结构分析
- prefix:路由分组的前缀,会在之前路由的基础上加上前缀来实现分组功能。
- middleWares:中间件。
- parent:父母路由节点。
- engine:引擎注入。
-
方法分析
- Group:向外暴露创建实例方法。
- addRoute:依赖engine.router的addRoute操作,在此基础上拼接上自己的prefix。
- GET && POST:基于addRoute创建一个路由。
- Use:添加中间件。
- createStaticHandler:创建服务静态目录,返回一个HandlerFunc类型。
- Static:调用createStaticHandler返回的handler注册一个路由。代码如下:
func (group *RouterGroup) Static(relativePath, root string) { handler := group.createStaticHandler(relativePath, http.Dir(root)) urlPattern := path.Join(relativePath, "/*filepath") group.GET(urlPattern, handler) }
代码调用过程
package gee
import (
"gee/gee/middleWares"
"net/http"
)
/*
*
注册路由
*/
func InitRouter() {
r := New()
r.Static("/assets", "./gee/static")
r.LoadHtmlGlob("./gee/templates/*")
v1 := r.Group("v1")
v1.Use(middleWares.Logger())
{
v1.GET("/hello", func(c *Context) {
c.HTML(http.StatusOK, "test.tmpl", H{
"title": "gee",
"content": "hello v1",
})
})
}
v2 := r.Group("v2")
v2.Use(middleWares.Logger())
{
v2.GET("/hello", func(c *Context) {
c.HTML(http.StatusOK, "test.tmpl", H{
"title": "gee",
"content": "hello v2",
})
})
}
r.Run(":9999")
}
- 这一块内容不难,只是在之前router篇基础上加了点小改动。我们今天主要还是要分析一下,RouterGroup在router里面的作用。我们来简单回顾下router里面关于RouterGroup的结构。
- RouterGroup主要是让engine能直接调用RouterGroup里面的方法操作,主要是创建新的RouterGroup对象,然后填充到groups*里面。
- groups是会存放新RouterGroup实例对象,他的作用主要是为了中间件调用服务的,代码如下:
// 当请求进来时,如果是某个group的请求,会收集中间件操作,然后传递给Context.handlers
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
var middleWares []HandlerFunc
for _, group := range engine.groups {
if strings.HasPrefix(req.URL.Path, "/"+group.prefix) {
middleWares = append(middleWares, group.middleWares...)
}
}
c := newContext(w, req)
c.handlers = middleWares
c.engine = engine
engine.router.handle(c)
}
总结
- 该篇文章我们讲了RouterGroup的结构以及实现方法,比较简单,主要还是看它在engine里面是怎么发挥作用来着。他这块设计还是很有意思来着,通过暴露*RouterGroup成员来实现创建新分组,简化了代码。
- 目前路由篇就算圆满结束了,接下来我们会继续填坑,下篇文章会填Context跟HandlerFunc的坑。😹😹