title: Beego脱坑(七)获取表单数据并解析到结构体
tags: go,beego
author : Clown95
获取表单数据
在之前的文章中我讲过使用表单获取数据,现在我们来再次回顾下,从表单中获取到用户名、密码、性别、年龄,并使用POST提到到服务器。
现在来完成 register.tpl 的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="/register" method="post">
<table>
<tbody>
<tr>
<td>用户名</td>
<td>
<input type="text" name ="Name" value="">
</td>
</tr>
<tr>
<td>密码</td>
<td>
<input type="password" name ="Pwd" value="">
</td>
</tr>
<tr>
<td>性别</td>
<td>
<input type="radio" name ="Sex" value="man"checked="checked">男
<input type="radio" name ="Sex" value="woman">女
</td>
</tr>
<tr>
<td>年龄</td>
<td>
<input type="text" name ="Age" value="">
</td>
</tr>
<tr>
<td>
<input type="submit" value="确认">
</td>
<td>
<input type="reset" value="重置">
</td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
实现控制器:
type RegController struct {
beego.Controller
}
func (this *RegController)Get() {
this.TplName ="register.tpl"
}
func (this *RegController)Post1() {
Name:=this.GetString("Name")
Pwd:=this.GetString("Pwd")
Sex:=this.GetString("Sex")
Age,err:=this.GetInt("Age")
if err==nil {
this.Ctx.WriteString("Name="+Name+"\nPwd="+Pwd+"\nSex="+Sex+"\nAge="+strconv.Itoa(Age))
}else{
this.Ctx.WriteString("Name="+Name+"\nPwd="+Pwd+"\nSex="+Sex)
}
}
我在这里再次强调一下,GetString("Name
") 和 input 中的 "Name
" 必须是完全相同的,它是区分大小写的。
注册路由:
beego.Router("/register",&controllers.RegController{})
如果注册路由中没有写调用方法,它会自动帮我们调用Get和Post方法 。
我们现在来演示之前提到的解析参数问题,我先把GetString("Name
")改成GetString("name
"),来执行下看看:
果然不出我们所料,Name没有被解析出来。
解析到结构体
现在我们已经获取到表单提交过来的数据了,我们希望能够把它解析到结构体上,接着让我们来演示一下。
首先我们根据表单提交的信息,定义一个结构体:
type Users struct {
Name string
Pwd string
Age int
Sex string
}
我们重新定义一个POST函数:
func (this *RegController)PostStruct() {
var user Users
if error:=this.ParseForm(&user);error!=nil { //传入user指针
this.Ctx.WriteString("出错了!")
}else{
this.Ctx.WriteString("我是结构体\n")
this.Ctx.WriteString("Name="+user.Name+"\nPwd="+user.Pwd+"\nSex="+user.Sex+"\nAge="+strconv.Itoa(user.Age))
}
}
- beego提供了ParseForm方法用来解析表单数据
- 调用ParseForm 这个方法的时候,传入的参数必须为一个 struct 的指针,否则对 struct 的赋值不会成功并返回
xx must be a struct pointer
的错误。
输出结果:
使用Tag标签
上面我们提到如果把GetString("Name
")中的Name改成name ,程序就不能解析到name的数据。其实在这里也同样适用如果我们把Name string
改成 NAme string
,结构体也是解析不到数据的,针对这情况我们有两种解决方法:
1.把NAme恢复成Name
2.使用Tag标签给属性设置别名:
NAme string `form:"Name"`
当我们这样设置的时候,就能解析到数据,现在我们来执行 http://127.0.0.1:8080/register
看看结果:
在某些情况下,表单中有一些数据我们不想解析,比如说注册或者登录时候的验证码信息,我们并不需要解析它。有两种方法:
1.Beego或者说go中是使用变量开头字母大小写,定义public 和private 属性的,如果我们不想解析某个数据,可以直接把那个属性的变量开头字母设置为小写
type Users struct {
Name string
Pwd string
Age int
Sex string
verCode string
}
2.使用Tag标签 "form:"-"" ,这样就表示我们忽略这个属性
type Users struct {
Name string
Pwd string
Age int
Sex string
VerCode string `form:"-"` //忽略验证码
}
这两种方法我们还是建议使用Tag标签,因为这样不会涉及到代码的可访问性。如果这个数据只是调用一次还好,但是如果是多次调用,并且要求可访问性是public,那么就会造成麻烦。
到目前为止我们已经使用了两次Tag标签,它的功能很多,我们以后详细的说下它。