第003节:请求参数绑定与多数据格式处理

                           

上节课我们学习了使用Gin框架的Engine的默认路由功能解析HTTP请求。本节课我们来学习gin框架的参数绑定操作和请求结果返回格式。

内容回顾

在上节课处理POST请求时,使用context.PostForm或者context.DefaultPostForm获取客户端表单提交的数据。

...
engine.Handle("POST", "/login", func(context *gin.Context) {
    fmt.Println(context.FullPath())
    //userName
    username := context.PostForm("username")
    fmt.Println(username)

    //passWord
    password := context.PostForm("pwd")
    fmt.Println(password)

    context.Writer.Write([]byte("User login"))
})
...

像上述这种只有username和password两个字段的表单数据进行提交时,可以使用context.PostForm和context.GetPostForm获取。但是如果表单数据较多时,使用PostForm和GetPostForm一次获取一个表单数据,开发效率较慢。

Gin框架提供给开发者表单实体绑定的功能,可以将表单数据与结构体绑定。

表单实体绑定

使用PostForm这种单个获取属性和字段的方式,代码量较多,需要一个一个属性进行获取。而表单数据的提交,往往对应着完整的数据结构体定义,其中对应着表单的输入项。gin框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率。如下所示:

以一个用户注册功能来进行讲解表单实体绑定操作。用户注册需要提交表单数据,假设注册时表单数据包含三项,分别为:username、phone和password。

type UserRegister struct {
    Username string form:"username" binding:"required"
    Phone    string form:"phone" binding:"required"
    Password string form:"password" binding:"required"
}

创建了UserRegister结构体用于接收表单数据,通过tag标签的方式设置每个字段对应的form表单中的属性名,通过binding属于设置属性是否是必须。

ShouldBindQuery

使用ShouldBindQuery可以实现Get方式的数据请求的绑定。具体实现如下:

func main() {

    engine := gin.Default()

    // http://localhost:8080/hello?name=davie&classes=软件工程
    engine.GET("/hello", func(context *gin.Context) {

        fmt.Println(context.FullPath())

        var student Student
        err := context.ShouldBindQuery(&student)
        if err != nil {
            log.Fatal(err.Error())
        }

        fmt.Println(student.Name)
        fmt.Println(student.Classes)
        context.Writer.Write([]byte("hello," + student.Name))

    })

    engine.Run()
}

type Student struct {
    Name    string form:"name"
    Classes string form:"classes"
}

ShouldBind

使用ShouldBind可以实现Post方式的提交数据的绑定工作。具体编程如下所示:

func main() {

    engine := gin.Default()

    engine.POST("/register", func(context *gin.Context) {
        fmt.Println(context.FullPath())
        var _register Register
        if err := context.ShouldBind(&_register); err != nil {
            log.Fatal(err.Error())
            return
        }

        fmt.Println(_register.UserName)
        fmt.Println(_register.Phone)
        context.Writer.Write([]byte(_register.UserName + " Register "))

    })

    engine.Run()
}

type Register struct {
    UserName string form:"name"
    Phone    string form:"phone"
    Password string form:"pwd"
}

ShouldBindJson

当客户端使用Json格式进行数据提交时,可以采用ShouldBindJson对数据进行绑定并自动解析,如下所示:

func main() {

    engine := gin.Default()

    engine.POST("/addstudent", func(context *gin.Context) {
        fmt.Println(context.FullPath())
        var person Person
        if err := context.BindJSON(&person); err != nil {
            log.Fatal(err.Error())
            return
        }

        fmt.Println("姓名:" + person.Name)
        fmt.Println("年龄:", person.Age)
        context.Writer.Write([]byte(" 添加记录:" + person.Name))
    })

    engine.Run()
}

type Person struct {
    Name string form:"name"
    Sex  string form:"sex"
    Age  int    form:"age"
}

当然,除了本案例讲解的三种数据绑定方式外,gin还支持其他的方式,也提供了相应的api供开发者学习和使用。在实际的开发过程中,大家可以慢慢学习。

原创文章,Golang中国出品,文章对应源码下载:https://www.qfgolang.com/?page_id=1973

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

学习交流群:点击这里给我发消息

QR code