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





目录
相关文章
|
3月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
3月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
5月前
|
人工智能 自然语言处理 JavaScript
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
Magnitude是一个基于视觉AI代理的开源端到端测试框架,通过自然语言构建测试用例,结合推理代理和视觉代理实现智能化的Web应用测试,支持本地运行和CI/CD集成。
739 15
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
|
5月前
|
移动开发 前端开发 JavaScript
H5 页面与 Web 页面的制作方法
H5页面制作利用HTML5、CSS3和JavaScript技术,结合H5编辑器或框架(如Adobe Dreamweaver、Ionic),注重移动设备兼容性与响应式布局。Web页面制作则基于传统HTML、CSS和JavaScript,借助文本编辑器或IDE完成开发。两者区别在于技术版本、交互性和浏览器支持:H5更互动、现代,但可能不兼容旧浏览器;Web页面更静态、兼容性广。根据需求选择:高交互选H5,广泛兼容选Web。
779 6
|
7月前
|
人工智能 开发框架 数据可视化
Eino:字节跳动开源基于Golang的AI应用开发框架,组件化设计助力构建AI应用
Eino 是字节跳动开源的大模型应用开发框架,帮助开发者高效构建基于大模型的 AI 应用。支持组件化设计、流式处理和可视化开发工具。
1170 27
|
7月前
|
存储 JSON JavaScript
WEB CAD插件通过上下文对象MxPluginContext修改UI界面的方法
本文介绍了如何使用MxPluginContext动态控制MxCAD项目的UI界面。通过该上下文对象,开发者可以灵活设置UI配置,如控制操作栏显隐、编辑按钮、添加侧边栏等。具体方法包括调用`getUiConfig()`获取并修改`mxUiConfig.json`中的属性,实现界面的定制化。此外,还提供了控制命令行聚焦的功能,解决输入框焦点锁定问题。详细代码示例和效果对比图展示了具体实现步骤,帮助开发者更好地适配项目需求。
|
10月前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
417 67
|
10月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
216 2
|
10月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
1033 1
|
10月前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP是一种流行的服务器端脚本语言,自诞生以来在Web开发领域占据重要地位。从简单的网页脚本到支持面向对象编程的现代语言,PHP经历了多次重大更新。本文探讨PHP的现代演进历程,重点介绍其在Web开发中的应用及框架创新,如Laravel、Symfony等。这些框架不仅简化了开发流程,还提高了开发效率和安全性。
89 3

推荐镜像

更多