李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
07.Beego框架请求参数和响应数据
Leefs
2022-08-01 PM
2103℃
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://lilinchao.com/archives/2289.html
上一篇
06.Beego框架控制器函数
下一篇
08.Beego框架ORM介绍
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Python
国产数据库改造
Golang
正则表达式
Git
线程池
Azkaban
ajax
Elasticsearch
HDFS
查找
SQL练习题
Kafka
Java工具类
机器学习
Thymeleaf
Golang基础
Flume
设计模式
GET和POST
并发线程
DataWarehouse
链表
前端
Docker
JVM
Redis
Jquery
并发编程
排序
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭