Gin学习笔记--请求参数绑定与多数据格式处理
使用context.PostForm和context.DefaultPostFrom获取客户端表单提交的数据。但是如果表单数据较多时,使用这两者开发速率较慢。
表单实体绑定
使用PostForm这种单个获取属性和字段的方式,代码量较多,需要一个一个属性进行获取,而表单数据的提交,往往对应着完整的数据结构体定义,其中对应着表单的输入项。
gin框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率。
以一个用户注册功能为例,来说明表单实体绑定操i做。用户注册需要提交表单数据,假设注册时需要包含三项:username,possword,phone
POST
package main import ( "fmt" "github.com/gin-gonic/gin" "log" ) func main() { engine := gin.Default() engine.POST("/reg", func(ctx *gin.Context) { fmt.Println(ctx.FullPath()) var register Register err := ctx.ShouldBind(®ister) if err != nil { log.Fatal(err) } fmt.Println(register.UserName) fmt.Println(register.Phone) ctx.Writer.Write([]byte(register.UserName)) }) engine.Run() } type Register struct { UserName string `form:"name"` Phone string `form:"phone"` PossWord string `form:"possword"` }
GET
package main import ( "fmt" "github.com/gin-gonic/gin" "log" ) func main() { engine := gin.Default() //http://localhost:8080/hello?name=kol&class=softengine engine.GET("/hello", func(ctx *gin.Context) { fmt.Println(ctx.FullPath()) var student Student err := ctx.ShouldBindQuery(&student) if err != nil { log.Fatal(err) } fmt.Println(student.Name) fmt.Println(student.Classes) ctx.Writer.Write([]byte("hello," + student.Name)) }) engine.Run() } type Student struct { Name string `form:"name"` Classes string `form:"classes"` }
package main import ( "fmt" "github.com/gin-gonic/gin" "log" ) func main() { engine := gin.Default() engine.POST("/addstudent", func(ctx *gin.Context) { fmt.Println(ctx.FullPath()) var person Person err := ctx.BindJSON(&person) if err != nil { log.Fatal(err) } fmt.Println("姓名:", person.Name) fmt.Println("性别:", person.Sex) ctx.Writer.Write([]byte("添加记录" + person.Name)) }) engine.Run() } type Person struct { Name string `form:"name"` Sex string `form:"sex"` Age int `form:"age"` }