李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
07.Beego框架请求参数和响应数据
Leefs
2022-08-01 PM
1553℃
0条
[TOC] ### 一、请求参数处理 `beego.Controller`基础控制器,提供了多种读取请求参数的函数,下面分别介绍各种获取参数的场景。 #### 1.1 默认获取参数方式 `beego.Controller`基础控制器提供了`GetXXX`序列获取参数的函数, `XXX`指的就是返回不同的数据类型。 **示例** ```go // 处理get请求 func (this *UserController) Get() { // 获取参数, 返回int类型 id ,_:= this.GetInt("id") // 获取参数,返回string类型, 如果参数不存在返回none作为默认值 username := this.GetString("username", "none") // 获取参数,返回float类型, 参数不存在则返回 0 price, _ := this.GetFloat("price", 0) } ``` **下面是常用的获取参数的函数定义:** - `GetString(key string, def ...string) string` - `GetInt(key string, def ...int) (int, error)` - `GetInt64(key string, def ...int64) (int64, error)` - `GetFloat(key string, def ...float64) (float64, error)` - `GetBool(key string, def ...bool) (bool, error)` 默认情况用户请求的参数都是 **字符串** 类型,如果要转换成其他类型,就可能会出现类型转换失败的可能性,因此除了`GetString`函数,其他`GetXXX`函数,都返回两个值,第一个值是需要获取的参数值,第二个就是error,表示是数据类型转换是否失败。 #### 1.2 绑定struct方式 除了上面一个一个的获取请求参数,针对POST请求的表单数据,beego支持直接将表单数据绑定到一个`struct`变量。 **示例** ```go // 定义一个struct用来保存表单数据 // 通过给字段设置tag, 指定表单字段名, - 表示忽略这个字段不进行赋值 // 默认情况下表单字段名跟struct字段名同名(小写) type UserForm struct { // 忽略掉Id字段 Id int `form:"-"` // 表单字段名为username Name interface{} `form:"username"` Age int `form:"age"` Email string } ``` *说明: 如果表单字段跟struct字段(小写)同名,不需要设置form标签。* **表单html代码:** ```html
名字:
年龄:
邮箱:
``` **控制器函数** ```go func (this *UserController) Post() { // 定义保存表单数据的struct对象 u := UserForm{} // 通过ParseForm函数,将请求参数绑定到struct变量。 if err := this.ParseForm(&u); err != nil { // 绑定参数失败 } } ``` **注意** - 定义 `struct` 时,字段名后如果有 form 这个 tag,则会以把 form 表单里的 name 和 tag 的名称一样的字段赋值给这个字段,否则就会把 form 表单里与字段名一样的表单内容赋值给这个字段。 如上面例子中,会把表单中的 `username` 和 age 分别赋值给 user 里的 Name 和 Age 字段,而 Email 里的内容则会赋给 Email 这个字段。 - 调用 Controller `ParseForm` 这个方法的时候,传入的参数必须为一个 struct 的指针,否则对 struct 的赋值不会成功并返回 `xx must be a struct pointer` 的错误。 - 如果要忽略一个字段,有两种办法,一是:字段名小写开头,二是:`form` 标签的值设置为 `-` *提示:使用struct绑定请求参数的方式,仅适用于POST请求。* #### 1.3 处理json请求参数 一般在接口开发的时候,有时候会将json请求参数保存在http请求的body里面。我们就不能使用前的方式获取json数据,需要直接读取请求body的内容,然后格式化数据。 **处理json参数的步骤**: - 在`app.conf`配置文件中,添加`CopyRequestBody=true` - 通过`this.Ctx.Input.RequestBody`获取请求body的内容 - 通过`json.Unmarshal`反序列化json字符串,将json参数绑定到struct变量。 **示例** + 定义struct用于保存json数据 ```go // 如果json字段跟struct字段名不一样,可以通过json标签设置json字段名 type UserForm struct { // 忽略掉Id字段 Id int `json:"-"` // json字段名为username Name string `json:"username"` Phone string } ``` + 控制器代码 ```go func (this *UserController) Post() { // 定义保存json数据的struct对象 u := UserForm{} // 获取body内容 body := this.Ctx.Input.RequestBody // 反序列json数据,结果保存至u if err := json.Unmarshal(body, &u); err == nil { // 解析参数失败 } } ``` *提示: 如果将请求参数是xml格式,xml参数也是保存在body中,处理方式类似,就是最后一步使用xml反序列化函数进行处理。* ### 二、处理响应数据 当处理完用户的请求之后,通常都会返回 html 代码,然后浏览器就可以显示 html 内容; 除了返回 html,在 api 接口开发中,还可以返回 `json`、`xml`、`jsonp` 格式的数据。 下面分别介绍 beego 返回不同数据类型的处理方式。 > 注意:如果使用 beego 开发 api,那么在 `app.conf` 中设置 `AutoRender = false`, 禁止自动渲染模板,否则 beego 每次处理请求都会尝试渲染模板,如果模板不存在则报错。 #### 2.1 返回json数据 **示例** ```go // 定义struct // 如果struct字段名跟json字段名不一样,可以使用json标签,指定json字段名 type User struct { // - 表示忽略id字段 Id int `json:"-"` Username string `json:"name"` Phone string } func (this *UserController) Get() { // 定义需要返回给客户端的数据 user := User{1, "Leefs", "15100000000"} // 将需要返回的数据赋值给json字段 this.Data["json"] = &user // 将this.Data["json"]的数据,序列化成json字符串,然后返回给客户端 this.ServeJSON() } ``` 调用 `ServeJSON` 之后,会设置 `content-type` 为 `application/json`,然后同时把数据进行 JSON 序列化输出。 #### 2.2 返回 xml 数据 **示例** ```go // 定义struct // 如果struct字段名跟xml字段名不一样,可以使用xml标签,指定xml字段名 type User struct { // - 表示忽略id字段 Id int `xml:"-"` Username string `xml:"name"` Phone string } func (this *UserController) Get() { // 定义需要返回给客户端的数据 user := User{1, "Leefs", "15100000000"} // 将需要返回的数据赋值给xml字段 this.Data["xml"] = &user // 将this.Data["xml"]的数据,序列化成xml字符串,然后返回给客户端 this.ServeXML() } ``` 调用 `ServeXML` 之后,会设置 `content-type` 为 `application/xml`,同时数据会进行 XML 序列化输出。 #### 2.3 jsonp 调用 ```go func (this *UserController) Get() { // 定义需要返回给客户端的数据 user := User{1, "Leefs", "15100000000"} // 将需要返回的数据赋值给jsonp字段 this.Data["jsonp"] = &user // 将this.Data["json"]的数据,序列化成json字符串,然后返回给客户端 this.ServeJSONP() } ``` 调用 ServeJSONP 之后,会设置 `content-type` 为 `application/javascript`,然后同时把数据进行 JSON 序列化,然后根据请求的 callback 参数设置 jsonp 输出。 #### 2.4 返回 html 如果开发的是网页,那么通常需要返回 html 代码,在 beego 项目中关于 html 视图部分,使用的是模板引擎技术,渲染 html,然后将结果返回给浏览器。 **示例** ```go func (c *MainController) Get() { // 设置模板参数 c.Data["Website"] = "www.lilinchao.com" c.Data["Email"] = "123@163.com" // 需要渲染的模板, beego会渲染这个模板,然后返回结果 c.TplName = "index.tpl" } ``` #### 2.5 添加响应头 为 http 请求添加 header ```go func (c *MainController) Get() { // 通过this.Ctx.Output.Header设置响应头 this.Ctx.Output.Header("Content-Type", "message/http") this.Ctx.Output.Header("Cache-Control", "no-cache, no-store, must-revalidate") } ``` *附参考原文链接地址* *http://www.codebaoku.com/beego/beego-parameter.html*
标签:
Beego
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/2289.html
上一篇
06.Beego框架控制器函数
下一篇
08.Beego框架ORM介绍
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Flume
FastDFS
Python
ClickHouse
Golang基础
数据结构
Http
Livy
SpringCloudAlibaba
Sentinel
人工智能
Flink
BurpSuite
Elasticsearch
Yarn
Spring
MyBatis
Git
MyBatis-Plus
MySQL
Hive
Shiro
Zookeeper
高并发
线程池
算法
Filter
哈希表
Spark Streaming
数据结构和算法
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞