获取用户传递的数据,包括 Get、POST 等方式的请求,beego 里面会自动解析这些数据,你可以通过如下方式获取数据:
第一种:this.Input().Get(
"key"
),如获取前端ID:
this.Input().Get("id")
第二种:
- this.GetString(key string) string
- this.GetStrings(key string) []string
- this.GetInt(key string) (int64, error)
- this.GetBool(key string) (bool, error)
- this.GetFloat(key string) (float64, error)
如获取前端传来的ID:
this.GetString("id")
而this.GetString("id")方法实际上只是多了一个类型转换的操作,源码如下:
func (c *Controller) GetInt(key string, def ...int) (int, error) {
strv := c.Ctx.Input.Query(key)
if len(strv) == 0 && len(def) > 0 {
return def[0], nil
}
return strconv.Atoi(strv) //就多了这一个转换
}
第三种:直接解析到 struct:
定义struct:
type user struct {
Id int `form:"-"`
Name interface{} `form:"username"` //对应表单中的name值,字段名首字母也必须大写,否则无法解析该参数的值
Age int `form:"age"` //对应表单中的name值,如果不写将无法解析该参数的值
Email string `form:"email"` //对应表单中的name值,如果不写将无法解析该参数的值
}
前端数据表单 :
<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
}
}
注意:
- StructTag form 的定义和renderform方法共用一个标签
- 定义 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
标签的值设置为-
- 上文方法前页的this对象,来源于方法的struct对象