美文网首页Go语言实践Go
Beego Controller 概要

Beego Controller 概要

作者: 霡霂976447044 | 来源:发表于2019-05-09 14:54 被阅读2次

    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")
    

    相关文章

      网友评论

        本文标题:Beego Controller 概要

        本文链接:https://www.haomeiwen.com/subject/asjwoqtx.html