Go语言实践Go

Beego Controller 概要

2019-05-09  本文已影响2人  霡霂976447044

01 参数配置

参数配置可以写在app/app.conf文件里面,
读取定义的参数

beego.AppConfig.String("httpport")

读取beego默认的参数值

beego.BConfig.Listen.HTTPPort

官网介绍:
https://beego.me/docs/mvc/controller/config.md

02 路由设置

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")
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]
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格式的提交,

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, 没有文件夹要先创建
    
}

this.Ctx.Input.Param(":id")

或者

this.GetString(":uid")

官方文档:https://beego.me/docs/module/context.md

6 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")
上一篇下一篇

猜你喜欢

热点阅读