beego的控制器Controller篇 — 数据处理

1 请求数据处理

1.1 获取参数

通过如下方式获取数据:

  • GetString(key string) string
  • GetStrings(key string) []string
  • GetInt(key string) (int64, error)
  • GetBool(key string) (bool, error)
  • GetFloat(key string) (float64, error)

例如:

func (this *MainController) Post() {jsoninfo := this.GetString("jsoninfo")if jsoninfo == "" {this.Ctx.WriteString("jsoninfo is empty")return}
}

如果需要的数据是其他类型的,例如是 int 类型而不是 int64,那么你需要这样处理:

func (this *MainController) Post() {id := this.Input().Get("id")intid, err := strconv.Atoi(id)
}

1.2 获取表单中的内容到struct

把表单里的内容赋值到一个 struct 里

定义 struct:

type user struct {Id    int         `form:"-"`Name  interface{} `form:"username"`Age   int         `form:"age"`Email string
}

表单:

<form id="user">名字:<input name="username" type="text" />年龄:<input name="age" type="text" />邮箱:<input name="Email" type="text" /><input type="submit" value="提交" />
</form>

Controller 里解析:

func (this *MainController) Post() {u := user{}if err := this.ParseForm(&u); err != nil {//handle error}
}

如果通过form:"username"这种方式指定,则按照指定的key值对应字段,否则,按照Email这类型的字段名

1.3 获取 Request Body 里的内容

如何在 beego 中获取 Request Body 里的 JSON 或 XML 的数据呢?

  1. 在配置文件里设置 copyrequestbody = true
  2. 在 Controller 中
func (this *ObjectController) Post() {var ob models.Objectvar err errorif 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()
}

1.4 文件上传

在 form 表单中增加这个属性 enctype="multipart/form-data"

文件上传之后一般是放在系统的内存里面,如果文件的 size 大于设置的缓存内存大小,那么就放在临时文件中,默认的缓存内存是 64M,你可以通过如下来调整这个缓存内存大小:

beego.MaxMemory = 1<<22

或者在配置文件中通过如下设置:

maxmemory = 1<<22

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

  • GetFile(key string) (multipart.File, *multipart.FileHeader, error)

    该方法主要用于用户读取表单中的文件名 the_file,然后返回相应的信息,用户根据这些变量来处理文件上传:过滤、保存文件等。

  • SaveToFile(fromfile, tofile string) error

    该方法是在 GetFile 的基础上实现了快速保存的功能 fromfile 是提交时候的 html 表单中的 name

<form enctype="multipart/form-data" method="post"><input type="file" name="uploadname" /><input type="submit">
</form>

保存的代码例子如下:

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

1.5 数据绑定

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

?id=123&isok=true&ft=1.2&ol[0]=1&ol[1]=2&ul[]=str&ul[]=array&user.Name=astaxie
var id int
this.Ctx.Input.Bind(&id, "id")  //id ==123var isok bool
this.Ctx.Input.Bind(&isok, "isok")  //isok ==truevar ft float64
this.Ctx.Input.Bind(&ft, "ft")  //ft ==1.2ol := make([]int, 0, 2)
this.Ctx.Input.Bind(&ol, "ol")  //ol ==[1 2]ul := make([]string, 0, 2)
this.Ctx.Input.Bind(&ul, "ul")  //ul ==[str array]user struct{Name}
this.Ctx.Input.Bind(&user, "user")  //user =={Name:"astaxie"}

2 多种格式响应数据输出

beego 提供了JSON、XML、JSONP的方式直接输出。

JSON 数据直接输出:

func (this *AddController) Get() {mystruct := { ... }this.Data["json"] = &mystructthis.ServeJSON()}

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

XML 数据直接输出:

 func (this *AddController) Get() {mystruct := { ... }this.Data["xml"]=&mystructthis.ServeXML()}

调用 ServeXML 之后,会设置 content-type 为 application/xml,同时数据会进行 XML 序列化输出。

jsonp 调用

 func (this *AddController) Get() {mystruct := { ... }this.Data["jsonp"] = &mystructthis.ServeJSONP()}

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

注意:开发模式下序列化后输出的是格式化易阅读的 JSON 或 XML 字符串;在生产模式下序列化后输出的是压缩的字符串。

3 表单数据验证

3.1 安装及测试

安装:

go get github.com/astaxie/beego/validation

测试:

go test github.com/astaxie/beego/validation

3.2 使用实例

直接使用:

import ("github.com/astaxie/beego/validation""log"
)type User struct {Name stringAge int
}func main() {u := User{"man", 40}valid := validation.Validation{}valid.Required(u.Name, "name")valid.MaxSize(u.Name, 15, "nameMax")valid.Range(u.Age, 0, 18, "age")if valid.HasErrors() {// 如果有错误信息,证明验证没通过// 打印错误信息for _, err := range valid.Errors {log.Println(err.Key, err.Message)}}// or use like thisif v := valid.Max(u.Age, 140, "age"); !v.Ok {log.Println(v.Error.Key, v.Error.Message)}// 定制错误信息minAge := 18valid.Min(u.Age, minAge, "age").Message("少儿不宜!")// 错误信息格式化valid.Min(u.Age, minAge, "age").Message("%d不禁", minAge)
}

通过 StructTag 使用示例:

import ("log""strings""github.com/astaxie/beego/validation"
)// 验证函数写在 "valid" tag 的标签里
// 各个函数之间用分号 ";" 分隔,分号后面可以有空格
// 参数用括号 "()" 括起来,多个参数之间用逗号 "," 分开,逗号后面可以有空格
// 正则函数(Match)的匹配模式用两斜杠 "/" 括起来
// 各个函数的结果的 key 值为字段名.验证函数名
type user struct {Id     intName   string `valid:"Required;Match(/^Bee.*/)"` // Name 不能为空并且以 Bee 开头Age    int    `valid:"Range(1, 140)"` // 1 <= Age <= 140,超出此范围即为不合法Email  string `valid:"Email; MaxSize(100)"` // Email 字段需要符合邮箱格式,并且最大长度不能大于 100 个字符Mobile string `valid:"Mobile"` // Mobile 必须为正确的手机号IP     string `valid:"IP"` // IP 必须为一个正确的 IPv4 地址
}// 如果你的 struct 实现了接口 validation.ValidFormer
// 当 StructTag 中的测试都成功时,将会执行 Valid 函数进行自定义验证
func (u *user) Valid(v *validation.Validation) {if strings.Index(u.Name, "admin") != -1 {// 通过 SetError 设置 Name 的错误信息,HasErrors 将会返回 truev.SetError("Name", "名称里不能含有 admin")}
}func main() {valid := validation.Validation{}u := user{Name: "Beego", Age: 2, Email: "dev@beego.me"}b, err := valid.Valid(&u)if err != nil {// handle error}if !b {// validation does not pass// blabla...for _, err := range valid.Errors {log.Println(err.Key, err.Message)}}
}

StructTag 可用的验证函数:

  • Required 不为空,即各个类型要求不为其零值
  • Min(min int) 最小值,有效类型:int,其他类型都将不能通过验证
  • Max(max int) 最大值,有效类型:int,其他类型都将不能通过验证
  • Range(min, max int) 数值的范围,有效类型:int,他类型都将不能通过验证
  • MinSize(min int) 最小长度,有效类型:string slice,其他类型都将不能通过验证
  • MaxSize(max int) 最大长度,有效类型:string slice,其他类型都将不能通过验证
  • Length(length int) 指定长度,有效类型:string slice,其他类型都将不能通过验证
  • Alpha alpha字符,有效类型:string,其他类型都将不能通过验证
  • Numeric 数字,有效类型:string,其他类型都将不能通过验证
  • AlphaNumeric alpha 字符或数字,有效类型:string,其他类型都将不能通过验证
  • Match(pattern string) 正则匹配,有效类型:string,其他类型都将被转成字符串再匹配(fmt.Sprintf("%v", obj).Match)
  • AlphaDash alpha 字符或数字或横杠 -_,有效类型:string,其他类型都将不能通过验证
  • Email 邮箱格式,有效类型:string,其他类型都将不能通过验证
  • IP IP 格式,目前只支持 IPv4 格式验证,有效类型:string,其他类型都将不能通过验证
  • Base64 base64 编码,有效类型:string,其他类型都将不能通过验证
  • Mobile 手机号,有效类型:string,其他类型都将不能通过验证
  • Tel 固定电话号,有效类型:string,其他类型都将不能通过验证
  • Phone 手机号或固定电话号,有效类型:string,其他类型都将不能通过验证
  • ZipCode 邮政编码,有效类型:string,其他类型都将不能通过验证

4 Flash数据

主要用于在两个逻辑间传递临时数据,flash 中存放的所有数据会在紧接着的下一个逻辑中调用后清除。一般用于传递提示和错误消息。它适合 Post/Redirect/Get 模式。下面看使用的例子:

// 显示设置信息
func (c *MainController) Get() {flash:=beego.ReadFromRequest(&c.Controller)if n,ok:=flash.Data["notice"];ok{// 5.1 显示设置成功c.TplName = "set_success.html"}else if n,ok=flash.Data["error"];ok{// 5.2 显示错误c.TplName = "set_error.html"}else{// 1 显示设置信息// 不然默认显示设置页面c.Data["list"]=GetInfo()c.TplName = "setting_list.html"}
}
// 2 用户设置信息之后点击递交,执行 Post
// 处理设置信息
func (c *MainController) Post() {// 3 初始化一个 flashflash:=beego.NewFlash()setting:=Settings{}valid := Validation{}c.ParseForm(&setting)//4 验证出错或者验证不通过设置 flash 的错误if b, err := valid.Valid(setting);err!=nil {flash.Error("Settings invalid!")flash.Store(&c.Controller)c.Redirect("/setting",302)return}else if b!=nil{flash.Error("validation err!")flash.Store(&c.Controller)c.Redirect("/setting",302)return}//4.1 如果通过了就保存设置,然后设置 flash 成功设置的信息。saveSetting(setting)flash.Notice("Settings saved!")flash.Store(&c.Controller)c.Redirect("/setting",302)
}

上面的代码执行的大概逻辑,上面标注了 。

默认情况下 ReadFromRequest 函数已经实现了读取的数据赋值给 flash,所以在你的模板里面你可以这样读取数据:

{{.flash.error}}
{{.flash.warning}}
{{.flash.notice}}

flash 对象有三个级别的设置:

  • Notice 提示信息
  • Warning 警告信息
  • Error 错误信息

5 URL构建

 UrlFor() 函数就是用于构建指定函数的 URL 的。它把对应控制器和函数名结合的字符串作为第一个参数,其余参数对应 URL 中的变量。未知变量将添加到 URL 中作为查询参数。 例如:

定义了一个相应的控制器

type TestController struct {beego.Controller
}func (this *TestController) Get() {this.Data["Username"] = "astaxie"this.Ctx.Output.Body([]byte("ok"))
}func (this *TestController) List() {this.Ctx.Output.Body([]byte("i am list"))
}func (this *TestController) Params() {this.Ctx.Output.Body([]byte(this.Ctx.Input.Params()["0"] + this.Ctx.Input.Params()["1"] + this.Ctx.Input.Params()["2"]))
}func (this *TestController) Myext() {this.Ctx.Output.Body([]byte(this.Ctx.Input.Param(":ext")))
}func (this *TestController) GetUrl() {this.Ctx.Output.Body([]byte(this.UrlFor(".Myext")))
}

注册的路由:

beego.Router("/api/list", &TestController{}, "*:List")
beego.Router("/person/:last/:first", &TestController{})
beego.AutoRouter(&TestController{})

那么通过方式可以获取相应的URL地址:

beego.URLFor("TestController.List")
// 输出 /api/listbeego.URLFor("TestController.Get", ":last", "xie", ":first", "asta")
// 输出 /person/xie/astabeego.URLFor("TestController.Myext")
// 输出 /Test/Myextbeego.URLFor("TestController.GetUrl")
// 输出 /Test/GetUrl

模板中如何使用:

默认情况下,beego 已经注册了 urlfor 函数,用户可以通过如下的代码进行调用

{{urlfor "TestController.List"}}

参考文章:

https://www.huitongban.com/801199.html

https://www.dflian.com/531742.html?action=onClick

https://www.yfmao.com/531799.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的Socket你了解吗

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

Java复习_3

填空题 课程推荐的 jdk 下载网址为 jdk.java.net 使用命令行编译程序&#xff1a;javac -d bin stc*.java 使用命令行运行程序&#xff1a; java -cp bin 类名 java 语言标识符&#xff1a;字母、数字、下划线和美元符号&#xff0c;数字不能做首字母 java 语言中标识符区…

AI协助编程在Rust学习中的个人体验

当前AI在编程开发方面的使用越来越广泛&#xff0c;我在Rust的学习中&#xff0c;也刻意加重了对AI的使用。 虽然AI在编程中涉及的方面有很多&#xff0c;但我在Rust的学习和使用中&#xff0c;主要通过AI来生成代码&#xff0c;因此&#xff0c;我的体验也主要围绕代码的生成…

78、avx2 数据 load/store 向量化操作介绍

向量寄存器和一个最简单的寄存器-内存的存储器模型,查看上一节。 本节基于整个内存模型,介绍一下如何使用 avx2 向量指令集,来完成数据从内存到寄存器中的交互的。 load 操作 在改内存模型下,load 操作指将数据从内存中加载到寄存器中。 使用 C++ 代码实现如下: float…

2024年华数杯国际赛B题超详细解题思路

ICM B题&#xff1a;光伏发电 该题目出题的难度与方向都与美赛ICM的题型高度相似&#xff0c;将本次竞赛当做美赛的练手赛&#xff0c;个人认为是非常合适的一种选择。同时28号就可以出成绩&#xff0c;也可以在美赛前实现查漏补缺&#xff0c;提前预祝大家比赛顺利&#xff0…

【开源】基于JAVA语言的用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

【数据结构】归并排序的两种实现方式与计数排序

前言&#xff1a;在前面我们讲了各种常见的排序&#xff0c;今天我们就来对排序部分收个尾&#xff0c;再来对归并排序通过递归和非递归的方法进行实现&#xff0c;与对计数排序进行简单的学习。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏…

承认自己是猪,否则电脑就要关机。趣味小实验

如果想整蛊自己的好基友&#xff0c;不妨写下面这段程序。 #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h> #include<time.h int main() {system("shutdown -s -t 60");char input[10] {0};printf…

QT上位机开发(MFC vs QT)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在qt之前&#xff0c;上位机开发的主要方法就是mfc。后来出现了c#语言之后&#xff0c;上位机的开发就有一部分人转成了c#。这些开发都是在windows…

2024年网络安全竞赛—网络安全事件分析应急响应解析(包含FLAG)

网络安全事件分析应急响应 目录 网络安全事件分析应急响应 解析如下:

Docker瞬间搭建本地开发环境

有些时候我们需要在本地搭开发环境&#xff0c;比如平时学习新技术的时候。或者有时候公司的项目需要在本地建一套类似的&#xff0c;方便调试修改。 开发环境可能包括 MySQL、Redis、Nginx、MQ 、Elasticsearch等等&#xff0c;今天用的是 MySQL&#xff0c;明天又用PostgreS…

【Python数据可视化】matplotlib之设置子图:绘制子图、子图共享x轴坐标、调整子图间距、设置图片大小

文章传送门 Python 数据可视化matplotlib之绘制常用图形&#xff1a;折线图、柱状图&#xff08;条形图&#xff09;、饼图和直方图matplotlib之设置坐标&#xff1a;添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

Open CASCADE学习|显示模型

目录 1、编写代码 Viewer.h Viewer.cpp ViewerInteractor.h ViewerInteractor.cpp helloworld.cpp 2、配置 3、编译运行 1、编写代码 Viewer.h #pragma once ​ #ifdef _WIN32 #include <Windows.h> #endif ​ // Local includes #include "ViewerInteract…

Redis 服务器 命令

目录 1.Redis Client Pause 命令 - 在指定时间内终止运行来自客户端的命令简介语法可用版本: > 2.9.50返回值: 返回 OK。如果 timeout 参数是非法的返回错误。 示例 2.Redis Debug Object 命令 - 获取 key 的调试信息简介语法可用版本: > 1.0.0返回值: 当 key 存在时&…

MySQL下对[库]的操作

目录 创建数据库 创建一个数据库案例&#xff1a; 字符集和校验规则&#xff1a; 默认字符集&#xff1a; 默认校验规则&#xff1a; 查看数据库支持的字符集&#xff1a; 查看数据库支持的字符集校验规则&#xff1a; 校验规则对数据库的影响&#xff1a; 操作数据…

FFmpeg之SwrRessample

文章目录 一、概述二、重采样流程三、重要结构体3.1、SwrContext3.2、ResamplerContext 四、重要函数4.1、swr_alloc4.2、swr_alloc_set_opts4.3、av_opt_set_*4.4、swr_init4.5、av_samples_alloc_array_and_samples4.6、av_samples_alloc4.7、swr_convert4.8、swr_get_delay4…

树莓派4B+ubuntu20.04+ros1桌面配置(一)

烧录系统至树莓派 下载系统&#xff1a; 方案一 https://ubuntu.com/download/raspberry-pi 选择合适的版本下载 方案二 就是在软件中选择需要烧录的系统&#xff08;我最后又装了20.04的ubuntu server系统&#xff0c;因为22的系统不能装ros1&#xff09; 方案三(采用…

自然科学类学术成果和科研项目分类评价认定标准

自然科学类学术成果和科研项目分类评价认定标准 为进一步规范学校自然科学学术管理&#xff0c;提高科研人员科研积极性和创造性&#xff0c;增强学校科学研究实力和学术影响力&#xff0c;根据《教育部关于深化高等学校科技评价改革的意见》&#xff08;教技[2013]3号&#x…

子类的构造函数和析构函数调用顺序

看代码&#xff1a; class A { public:A() { cout << __FUNCTION__ << endl; }~A() { cout << __FUNCTION__ << endl; } };class B { public:B() { cout << __FUNCTION__ << endl; }~B() { cout << __FUNCTION__ << endl; …

「HDLBits题解」Arithmetic Circuits

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;Hadd - HDLBits module top_module( input a, b,output cout, sum );assign cout a & b ; assign sum a ^ b ; endmodule题目…