jjnoob

tizi-beego-04-控制器函数

2019-07-28
jjnoob

参考

控制器函数指的是处理用户请求的函数, beego框架支持两种处理用户请求的函数。

  1. beego.FilterFunc类型的独立函数
  2. 控制器函数 (RESTful 风格实现, beego默认推荐的格式)

一. beego.FilterFunc函数

这是最简单的请求处理函数,函数原型定义:

type FilterFunc func(*context.Context)

也就是只要定义一个函数,并且接收一个Context参数,那么这个函数就可以作为处理用户请求的函数。

例子:

func DoLogin(ctx *context.Context) {
     // ..处理请求的逻辑...
     // 可以通过Context 获取请求参数,返回请求结果
}

有了处理函数,我们就可以将处理函数跟一个url路由绑定起来.

例子:

beego.Get("/user/login", DoLogin)

新版的beego设计,默认不推荐使用beego.FilterFunc函数方式.

二. 控制器函数

控制器函数是beego的RESTful api的实现方式,在beego的设计中,控制器就是一个嵌套了beego.Controller的结构体对象。

例子:

// 定义一个新的控制器
type UserController struct {
    // 嵌套beego基础控制器
    beego.Controller
}

前面介绍过,struct嵌套,就类似其他高级语言的 继承 特性,嵌套了beego.Controller控制器,就拥有了beego.Controller定义的属性和函数。

控制器命名规则约定:XxxController Xxx就是我们的控制器名字, 这是为了便于阅读,看到Controller结尾的struct就知道是一个控制器。

下面看一个完整控制器的例子:

type UserController struct {
    // 嵌套beego基础控制器
    beego.Controller
}

// 在调用其他控制器函数之前,会优先调用Prepare函数
func (this *UserController) Prepare() {
    // 这里可以跑一些初始化工作
}

// 处理get请求
func (this *UserController) Get() {
    // 处理逻辑
}

// 处理post请求
func (this *UserController) Post() {
    // 处理逻辑
}

注册路由:

// 在这里参数:id是可选的
beego.Router("/user/?:id", &controllers.UserController{})

根据上面注册的路由规则, 下面的展示对应的http请求和处理函数:

GET /user/2 - 由Get函数处理
POST /user - 由Post函数处理

前面路由设置章节介绍过控制器的路由规则是Get请求由Get函数处理,Post请求由Post函数处理,以此类推。

三. 如何提前结束请求。

如果我们在Prepare函数处理用户的权限验证,验证不通过,我们一般都希望结束请求,不要执行后面的函数,beego提供了StopRun函数来结束请求。

例子:

func (this *UserController) Prepare() {
    // 处理权限验证逻辑
    
    // 验证不通过,返回错误信息,结束请求
    this.Data["json"] = map[string]interface{}{"error":"没有权限", "errno":401}
	this.ServeJSON()
    this.StopRun()
}

调用 StopRun 之后,不会再执行Finish函数,如果有需要可以在调用StopRun之后,手动调用Finish函数。


Similar Posts

Content