Beego Controller 概要
01 参数配置
参数配置可以写在app/app.conf
文件里面,
读取定义的参数
beego.AppConfig.String("httpport")
读取beego默认的参数值
beego.BConfig.Listen.HTTPPort
官网介绍:
https://beego.me/docs/mvc/controller/config.md
02 路由设置
- 一般情况的RESTful设置路由
beego.Router("/login", ControllerInterface)
在ControllerInterface实现GET
请求对应的Get
方法。
- 单独为一种请求方式设置路由
beego.Get("/",func(ctx *context.Context){
ctx.Output.Body([]byte("hello world"))
})
- 正则路由
beego.Router(“/api/?:id”, &controllers.RController{})
默认匹配 例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”
获取id:
ControllerInterface.Ctx.Input.Param(":id")
- 自定义RESTful路由指向的view
beego.Router("/api/list",&RestController{},"*:ListFood")
beego.Router("/api/create",&RestController{},"post:CreateFood")
beego.Router("/api/update",&RestController{},"put:UpdateFood")
beego.Router("/api/delete",&RestController{},"delete:DeleteFood")
Note:如果同时存在 * 和对应的 HTTP Method,那么优先执行 HTTP Method 的方法,
- 自动匹配路由
beego.AutoRouter(&controllers.ObjectController{})
使用beego.AutoRouter
方法实现将结构体的方法名映射为对应的url
/object/login 调用 ObjectController 中的 Login 方法
对于额外的参数保存在 this.Ctx.Input.Params
当中:
/object/blog/2013/09/12 调用 ObjectController 中的 Blog 方法,参数如下:map[0:2013 1:09 2:12]
- 自动路由匹配-注解路由
利用go的注解,实现路由注册。
beego.Include(&CMSController{})
使用beego.Include()
函数实现注解路由。
下面是结构体实现:
// CMS API
type CMSController struct {
beego.Controller
}
func (c *CMSController) URLMapping() {
c.Mapping("StaticBlock", c.StaticBlock)
c.Mapping("AllBlock", c.AllBlock)
}
// @router /staticblock/:key [get]
func (this *CMSController) StaticBlock() {
}
// @router /all/:key [get]
func (this *CMSController) AllBlock() {
}
两处需要设置: 1) 定义URLMapping方法在里面映射,如果没有这个函数,beego会通过反射,定义此函数可以提高效率。 2) 在view函数上写注解
- 命名空间路由
//初始化 namespace
ns :=
beego.NewNamespace("/v1",
beego.NSCond(func(ctx *context.Context) bool {
if ctx.Input.Domain() == "api.beego.me" {
return true
}
return false
}),
beego.NSBefore(auth),
beego.NSGet("/notallowed", func(ctx *context.Context) { // GET /v1/notallowed
ctx.Output.Body([]byte("notAllowed"))
}),
beego.NSRouter("/version", &AdminController{}, "get:ShowAPIVersion"), // GET /v1/version
beego.NSRouter("/changepassword", &UserController{}), //
GET /v1/changepassword
beego.NSNamespace("/shop",
beego.NSBefore(sentry),
beego.NSGet("/:id", func(ctx *context.Context) { // GET /v1/shop/123
ctx.Output.Body([]byte("notAllowed"))
}),
),
beego.NSNamespace("/cms", // GET /v1/cms/ 对应 MainController、CMSController、BlockController 中得注解路由
beego.NSInclude(
&controllers.MainController{},
&controllers.CMSController{},
&controllers.BlockController{},
),
),
)
//注册 namespace
beego.AddNamespace(ns)
3 Controller参数
Controller接口有一个Prepare
方法可以重写。可以在里面做用户判断。
4 XSRF
beego开启XSRF只需要在配置文件里面配置
enablexsrf = true
xsrfkey = 61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o
xsrfexpire = 3600
开启之后会对POST等请求进行防御,同时会在用户的cookie里面设置一个key为_xsrf
的cookie值。
在前端,请求头里面设置X-XSRFToken
指定某一个视图关闭xsrf
func (a *AdminController) Prepare() {
a.EnableXSRF = false
}
5 请求数据处理
对于普通get请求和post等请求以application/x-www-form-urlencoded
方式使用这个函数可以得到数据
c.GetString(key string) string
里面会调用c.Ctx.Input.Query(key)
,该函数返回 Get 请求和 Post 请求中的所有数据。
对于json格式的提交,
- 配置文件设置
copyrequestbody=true
- 在视图函数中
func (this *ObjectController) Post() {
var ob models.Object
var err error
if err = json.Unmarshal(this.Ctx.Input.RequestBody, &ob); err == nil {
objectid := models.AddOne(ob)
this.Data["json"] = "{\"ObjectId\":\"" + objectid + "\"}"
} else {
this.Data["json"] = err.Error()
}
this.ServeJSON()
}
文件提交保存:
func (c *FormController) Post() {
f, h, err := c.GetFile("uploadname")
if err != nil {
log.Fatal("getfile err ", err)
}
defer f.Close()
c.SaveToFile("uploadname", "static/upload/" + h.Filename) // 保存位置在 static/upload, 没有文件夹要先创建
}
- 对于 /v1/user/89877的路由参数获取
this.Ctx.Input.Param(":id")
或者
this.GetString(":uid")
官方文档:https://beego.me/docs/module/context.md
6 session
- 开启session
sessionon = true
导入redis
_ "github.com/astaxie/beego/session/redis"
设置redis参数
beego.BConfig.WebConfig.Session.SessionProvider = "redis"
beego.BConfig.WebConfig.Session.SessionProviderConfig = "127.0.0.1:6379"
在视图中使用
this.SetSession("asta", int(1))
在context中也能使用Session。
session 基本原理:
用户请求某一个API,判断是否存在sessionid这个cookie值,第一次请求,没有,那么生成一个uuid来代表sessionid,返回给用户存储到浏览器。第二次请求API,这个API里面会得到请求体的cookie的sessionid值,调用SetSession("asta", int(1))
,将sessionid作为key,value为{"asta": "1"}
存储到redis数据库中。
7 过滤器
var FilterUser = func(ctx *context.Context) {
_, ok := ctx.Input.Session("uid").(int)
if !ok && ctx.Request.RequestURI != "/login" {
ctx.Redirect(302, "/login")
}
}
beego.InsertFilter("/*",beego.BeforeRouter,FilterUser)
context 对象是 Filter 函数的参数对
8 返回json
func (this *AddController) Get() {
mystruct := { ... }
this.Data["json"] = &mystruct
this.ServeJSON()
}
9 日志
import "github.com/astaxie/beego/logs"
logs.SetLogger(logs.AdapterFile,`{"filename":"project.log","level":7,"maxlines":0,"maxsize":0,"daily":true,"maxdays":10,"color":true}`)
logs.Debug("my book is bought in the year of ", 2016)
logs.Info("this %s cat is %v years old", "yellow", 3)
logs.Warn("json is a type of kv like", map[string]int{"key": 2016})
logs.Error(1024, "is a very", "good game")