Beego脱坑(七)获取表单数据并解析到结构体

19 篇文章 36 订阅

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))
    }
}

  1. beego提供了ParseForm方法用来解析表单数据
  2. 调用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标签,它的功能很多,我们以后详细的说下它。

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值