j
jaryue
V1
2023/03/28阅读:8主题:默认主题
goweb框架day4
-
实现路由分组控制(Route Group Control)
什么是分组
前缀来区分,并且支持分组的嵌套。例如/post是一个分组,**/post/a和/post/b可以是该分组下的子分组**
作用
作用在/post分组上的中间件(middleware),也都会作用在子分组,子分组还可以应用自己特有的中间件。 (什么中间件在后面会学)
-
建立一个节点RouterGroup,储存分组的各种属性
type RouterGroup struct {
Prefix string //父元素的字符串
Middlewares []router.HandlerFunc //中间件函数
Parent *RouterGroup //父元素的节点
Engine *Engine //所有的分组公用一个engine以实现所有的函数的接口
}
-
重定义engine节点,新添加RouterGroup与groups属性,用于储存分组以及可调用RouterGroup中的所有属性
type Engine struct {
*RouterGroup //分组
Router *router.Rrouter //路由的映射
Groups []*RouterGroup // 储存所有的分组
}
-
定义group函数,在当前路由分组下创建一个子分组,可以通过传入前缀字符串来指定子分组的前缀,该函数会返回一个新的 RouterGroup 对象,表示创建的子分组。在创建子分组时,需要指定父分组和引擎节点。
该函数的实现主要是创建一个新的 RouterGroup 对象,将该对象的 Prefix 属性设置为当前分组的 URL 前缀与传入的参数前缀拼接得到的新前缀,将该对象的 Parent 属性设置为当前分组,将该对象的 Engine 属性设置为当前分组的 Engine 属性,然后将该对象添加到当前分组的 Engine 对象的 Groups 数组中。这样,可以通过调用该函数来创建一个新的路由分组,并将其添加到路由分组树中。
// 在当前路由分组下创建一个子分组,可以通过传入前缀字符串来指定子分组的前缀,该函数会返回一个新的 RouterGroup 对象,表示创建的子分组。在创建子分组时,需要指定父分组和引擎节点。
func (group *RouterGroup) Group(prefix string) *RouterGroup {
engine := group.Engine
newGroup := &RouterGroup{
Prefix: group.Prefix + prefix,
Parent: group,
Engine: engine,
}
engine.Groups = append(engine.Groups, newGroup)
return newGroup
}
-
重定义addroute函数,该函数的实现主要是调用 Engine 的 Router 对象的 AddRoute 方法来添加路由映射。在调用该方法前,需要将 comp 参数与 group 对象的 Prefix 属性合并,以获取完整的 URL 模式。然后,通过调用 Engine 对象的 Router 的 AddRoute 方法,将请求方法、URL 模式和路由处理函数注册到路由映射表中。这样,当客户端请求该 URL 时,将自动调用注册的路由处理函数来处理该请求。
func (group *RouterGroup) AddRoute(method string, comp string, handler router.HandlerFunc) {
pattern := group.Prefix + comp//父元素+当前的参数组成路由
log.Printf("Route %4s - %s", method, pattern)
group.Engine.Router.AddRoute(method, pattern, handler) //添加路由映射
}

作者介绍
j
jaryue
V1