beego源码分析(三)——了解

了解-路由及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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值