Golang 语言 Web 框架 beego v2 之控制器方法和输入输出数据

简介: Golang 语言 Web 框架 beego v2 之控制器方法和输入输出数据

01

介绍


创建 beego 的控制器,首先要匿名组合 beego.Controller,beego.Controller实现了接口 beego.ControllerInterface,beego.ControllerInterface 定义了许多函数,这样我们创建的控制器就有了所有 beego.Controller 的方法,我们可以重写这些方法实现自己的业务逻辑。


type UserController struct {
    beego.Controller
}


02

控制器方法


beego.Controller 实现了所有 HTTP Method 对应的方法,例如Get(),Post(),Put(),Delete() 等。beego 默认支持 RESTful 请求方式,可以根据用户请求的 HTTP Method 执行对应的方法,用户可以重写这些方法实现自己的业务逻辑。


除了对应 HTTP Method 的方法之外,还有 Prepare() 和 Finish() 。其中,Prepare() 方法会在对应 HTTPMethod 的方法之前执行,用户可以重写 Prepare() 方法,实现一些预处理的业务逻辑;Finash() 方法会在对应 HTTP Method 的方法之后执行,用户可以重写 Finish() 方法,实现一些释放资源的业务逻辑。


Init(ct *context.Context, controllerName, actionName string, app interface{})

方法用于做初始化操作。


// Init generates default values of controller operations.
func (c *Controller) Init(ctx *context.Context, controllerName, actionName string, app interface{}) {
  c.Layout = ""
  c.TplName = ""
  c.controllerName = controllerName
  c.actionName = actionName
  c.Ctx = ctx
  c.TplExt = "tpl"
  c.AppController = app
  c.EnableRender = true
  c.EnableXSRF = true
  c.Data = ctx.Input.Data()
  c.methodMapping = make(map[string]func())
}


beego.ControllerInterface 的全部方法:


// ControllerInterface is an interface to uniform all controller handler.
type ControllerInterface interface {
  Init(ct *context.Context, controllerName, actionName string, app interface{})
  Prepare()
  Get()
  Post()
  Delete()
  Put()
  Head()
  Patch()
  Options()
  Trace()
  Finish()
  Render() error
  XSRFToken() string
  CheckXSRFCookie() bool
  HandlerFunc(fn string) bool
  URLMapping()
}


限于篇幅,其它一些方法,我们在用到时再介绍。


03

输入数据


接收请求参数:

用户通过 RESTful 请求方式接收数据,包括 Get、Post、Put、Delete 等,beego 可以自动解析这些数据。


GetString(key string, def ...string) string
GetStrings(key string, def ...[]string) []string
GetInt(key string, def ...int) (int, error)
GetInt8(key string, def ...int8) (int8, error)
GetUint8(key string, def ...uint8) (uint8, error)
GetInt16(key string, def ...int16) (int16, error)
GetUint16(key string, def ...uint16) (uint16, error)
GetInt32(key string, def ...int32) (int32, error)
GetUint32(key string, def ...uint32) (uint32, error)
GetInt64(key string, def ...int64) (int64, error)
GetUint64(key string, def ...uint64) (uint64, error)
GetBool(key string, def ...bool) (bool, error)
GetFloat(key string, def ...float64) (float64, error)


除了使用 beego 提供的方法接收请求数据,还可以使用以下方式接收。


u.Input().Get("username")


form 表单数据解析到 struct:

如果要把表单里的内容赋值到一个 struct 里,除了用上面的方法一个一个获取再赋值外,beego 提供了通过另外一个更便捷的方式,就是通过 struct 的字段名或 tag 与表单字段对应直接解析到 struct。


type user struct {
  Id int64 `form:"-"`
  Name string `form:"username"`
  Age uint32 `form:"age"`
  Gender string
}
func (u *UserController) Create() {
  // form 表单
  user := user{}
  err := u.ParseForm(&user)
  if err != nil {
     log.Fatalln(err.Error())
     return
  }
  // 输出
  fmt.Println(user)
  u.Redirect("/", 200)
}


获取Request Body 里的数据:

在 API 的开发中,我们经常会用到 JSON 或 XML 来作为数据交互的格式,在 beego 中获取Request Body中的JSON数据,需要在配置文件中设置:copyrequestbody=true


type user struct {
  Id int64 `form:"-"`
  Name string `form:"username"`
  Age uint32 `form:"age"`
  Gender string
}
func (u *UserController) Create() {
  // Request Body
  user := user{}
  err := json.Unmarshal(u.Ctx.Input.RequestBody, &user)
  if err != nil {
    log.Fatalln(err.Error())
    return
  }
  // 输出
  fmt.Println(user)
  u.Data["json"] = map[string]interface{}{"code": 200, "msg": "success"}
  u.ServeJSON()
}


文件上传:

Beego 提供了两个很方便的方法来处理文件上传:

  • GetFile(key string) (multipart.File, *multipart.FileHeader, error)
    该方法主要用于用户读取表单中的文件名,然后返回相应的信息,用户根据这些变量来处理文件上传:过滤、保存文件等。

  • SaveToFile(fromfile, tofile string) error
    该方法是在 GetFile 的基础上实现了快速保存的功能fromfile 是提交时候的 html 表单中的 name


注意事项:

  • form 表单中增加这个属性 enctype="multipart/form-data"
  • 文件上传之后一般是放在系统的内存里面,如果文件的 size 大于设置的缓存内存大小,那么就放在临时文件中,默认的缓存内存是 64M,你可以通过如下来调整这个缓存内存大小:
    web.MaxMemory = 1<<22
    或者在配置文件中通过如下设置:
    maxmemory = 1<<22
  • beego 的另外一个参数,MaxUploadSize 来限制最大上传文件大小——如果你一次上传多个文件,那么它限制的就是这些所有文件合并在一起的大小。


示例代码:


<form method="post" action="http://localhost:8080/v1/user/add" enctype="multipart/form-data">
    用户名:<input type="text" name="username"><br>
    年龄:<input type="text" name="age"><br>
    性别:<input type="text" name="Gender"><br>
    头像:<input type="file" name="avatar"><br>
    <input type="submit" value="注册">
</form>
func (u *UserController) Create() {
  // 上传文件
  f, h, err := u.GetFile("avatar")
  if err != nil {
    log.Fatalln(err.Error())
    return
  }
  defer f.Close()
  err = u.SaveToFile("avatar", "static/img/" + h.Filename)
  if err != nil {
    log.Println(err.Error())
    return
  }
  u.Redirect("/", 200)
}


绑定请求参数到指定对象:

beego 支持从用户请求中直接数据 bind 到指定的对象,例如请求地址如下:


http://localhost:8080/v1/user/add?uid=100&language[]=chinese&language[]=english&user.Gender=woman


示例代码:


type user struct {
  Id     int64  `form:"-"`
  Name   string `form:"username"`
  Age    uint32 `form:"age"`
  Gender string
}
func (u *UserController) Create() {
  // 数据绑定
  // 基本类型
  var uid int64
  err := u.Ctx.Input.Bind(&uid, "uid")
  if err != nil {
    log.Fatalln(err.Error())
    return
  }
  uidStr := strconv.FormatInt(uid, 10)
  u.Ctx.WriteString(uidStr)
  // 切片
  language := make([]string, 0, 2)
  err = u.Ctx.Input.Bind(&language, "language")
  if err != nil {
    log.Fatalln(err.Error())
    return
  }
  fmt.Println(language)
  // 结构体
  user := user{}
  err = u.Ctx.Input.Bind(&user, "user")
  if err != nil {
    log.Fatalln(err.Error())
    return
  }
  fmt.Println(user)
}


04

输出数据


除了简单的字符串输出之外,我们在开发 RESTful API 接口的时候,一般会使用 JSON 数据,beego 提供了两个方法,分别是

ServeJSON(encoding ...bool) 和 ServeJSONP()


调用 ServeJSON 之后,会设置 content-type 为 application/json,然后同时把数据进行 JSON 序列化输出。


调用 ServeJSONP 之后,会设置 content-type 为 application/javascript,然后同时把数据进行 JSON 序列化,然后根据请求的 callback 参数设置 jsonp 输出。


示例代码:


func (u *UserController) Create() {
  u.Data["json"] = map[string]interface{}{"code":200, "msg":"success"}
  u.ServeJSON()
}
func (u *UserController) Update() {
  u.Data["jsonp"] = map[string]interface{}{"code":200, "msg":"success"}
  u.ServeJSON()
}


05

总结


本文我们介绍了 beego 的控制器函数,其中包括对应 HTTP Method 的方法和 Init()、Prepare()、Finish() 等。还介绍了 beego 输入和输出数据的使用方法,并列举了相应的示例代码。如果想了解更多关于 beego 输入和输出数据的用法,请参阅官方文档。





目录
相关文章
|
8天前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
36 4
Golang语言之管道channel快速入门篇
|
8天前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
28 4
Golang语言文件操作快速入门篇
|
8天前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
36 3
Golang语言之gRPC程序设计示例
|
8天前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
28 4
|
8天前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
18 4
Golang语言goroutine协程篇
|
8天前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
17 3
Golang语言之Prometheus的日志模块使用案例
|
8天前
|
JSON Go 数据格式
Golang语言结构体链式编程与JSON序列化
这篇文章是关于Go语言中结构体链式编程与JSON序列化的教程,详细介绍了JSON格式的基本概念、结构体的序列化与反序列化、结构体标签的使用以及如何实现链式编程。
16 4
|
8天前
|
Go
Golang语言结构体(struct)面向对象编程进阶篇(封装,继承和多态)
这篇文章是关于Go语言中结构体(struct)面向对象编程进阶篇的教程,涵盖了Go语言如何实现封装、继承和多态,以及结构体内存布局的相关概念和案例。
20 4
|
8天前
|
Go
Golang语言基础之接口(interface)及类型断言
这篇文章是关于Go语言中接口(interface)及类型断言的详细教程,涵盖了接口的概念、定义、实现、使用注意事项以及类型断言的多种场景和方法。
16 4
|
8天前
|
Go
Golang语言结构体(struct)面向对象编程基础篇
这篇文章是关于Go语言中结构体(struct)面向对象编程的基础教程,详细介绍了面向对象编程在Go语言中的应用、结构体的定义与初始化、方法定义、跨包实例化结构体以及结构体方法和普通函数的区别。
19 4