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 输入和输出数据的用法,请参阅官方文档。





目录
相关文章
|
7月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
375 2
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
381 3
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
1800 1
|
前端开发 中间件 Go
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
342 1
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
1261 1
|
存储 前端开发 API
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
630 0
|
7月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
591 4
|
11月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
11月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。

热门文章

最新文章

推荐镜像

更多