获取用户传递的数据,包括 Get、POST 等方式的请求,beego 里面会自动解析这些数据,你可以通过如下方式获取数据:
第一种:this.Input().Get(
"key"
),如获取前端ID:
this.Input().Get("id")
第二种:
this.GetString(key string) stringthis.GetStrings(key string) []stringthis.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值,如果不写将无法解析该参数的值}
前端数据表单 :
<formid="user">名字:<inputname="username" type="text" />年龄:<inputname="age" type="text" />邮箱:<inputname="email" type="text" /><inputtype="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对象