了解-路由及controller的处理过程
在初探和起源中我们知道了基本原理、初始化及启动时的处理,本节主要探究controller的大致处理过程。
一、系统路由及controller func信息的存储大致过程
在初探里我们列出了各种路由的调用过程,最终均会调用p.AddToRouter。因此我们先根据其中特殊的几个了解下详细的过程。
1.Get-基础路由
beego.Get->BeeApp.Handlers.Get->p.AddMethod->p.addToRouter
我们先了解下AddMethod,具体注释在行尾:
func (p *ControllerRegister) AddMethod(method, pattern string, f FilterFunc) {
method = strings.ToUpper(method)
if _, ok := HTTPMETHOD[method]; method != "*" && !ok {
//剔除不支持的请求方式
panic("not support http method: " + method)
}
route := &ControllerInfo{
}
route.pattern = pattern//设置路由
route.routerType = routerTypeRESTFul//restful router类型
route.runFunction = f//设置处理方法
methods := make(map[string]string)
if method == "*" {
//如果是全匹配,添加所有请求方式
for _, val := range HTTPMETHOD {
methods[val] = val
}
} else {
//否则只添加指定请求方式
methods[method] = method
}
route.methods = methods
for k := range methods {
//遍历请求方式
if k == "*" {
//如果全匹配,遍历添加所有请求方式m、pattern及route到Tree上
for _, m := range HTTPMETHOD {
p.addToRouter(m, pattern, route)
}
} else {
//否则只添加指定请求方式k、pattern及route到Tree上
p.addToRouter(k, pattern, route)
}
}
}
2.Router-固定/正则/自定义方法路由
beego.Router->BeeApp.Handlers.Add->p.addWithMethodParams->p.addToRouter
我们先了解下addWithMethodParams,具体注释在行尾:
//调用到此处时methodParams为nil
func (p *ControllerRegister) addWithMethodParams(pattern string, c ControllerInterface, methodParams []*param.MethodParam, mappingMethods ...string) {
reflectVal := reflect.ValueOf(c)
t := reflect.Indirect(reflectVal).Type()//获取controller指向值的类型,后期匹配后会反射获取其对象
methods := make(map[string]string)//方法集
if len(mappingMethods) > 0 {
//指定处理方法
semi := strings.Split(mappingMethods[0], ";")//是否包含多种请求方式及处理方法
for _, v := range semi {
colon := strings.Split(v, ":")//拆分请求方式及处理方法
if len(colon) != 2 {
panic("method mapping format is invalid")
}
comma := strings.Split(colon[0], ",")//拆分请求方式
for _, m := range comma {
if _, ok := HTTPMETHOD[strings.ToUpper(m)]; m == "*" || ok {
//合法的请求方式或通配符
if val := reflectVal.MethodByName(colon[1]); val.IsValid(