Golang Gin 请求参数绑定与多数据格式处理

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

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

像上述这种只有username和password两个字段的表单数据进行提交时,可以使用context.PostForm 和context.GetPostForm获取。

但是如果表单数据较多时,使用PostForm和GetPostForm一次获取一个表单数据,开发效率较慢。

在实际的开发过程当中,往往会面对非常复杂的业务逻辑,比如提交某个数据的时候,需要很多的字段,很多的属性,比如提交用户注册表单,需要用户名注册密码,身份证信息,手机号,昵称等等。如果还是使用上面这种方式获取字段属性,这样就显得效率有些低了。

Gin框架提供给开发者表单实体绑定的功能,可以将表单数据与结构体绑定。(其实也就是将表单提交的数据直接映射为结构体实体)

扫描二维码关注公众号,回复: 14961469 查看本文章

表单实体绑定


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

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

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

结构体里面的属性对应我们提交表单里面的哪些字段?通过后面的tag标签来设定。这里面有form的属性,这个表示要对应到http请求当中表单当中的哪一个字段。

可以看到Username对应的是表单当中的username字段。

下面是三种表单实体绑定的方式,分别是get请求方式,其次是post请求方式。在post请求方式里面讲两种,其中一种是mutiform格式,其次是json格式。

(1)get请求表单数据提交和服务端具体结构体的定义相应绑定操作

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
)

func main() {
	engine := gin.Default()
	//http://localhost:8080/hello?name=lucas&class=软件工程
	engine.GET("/hello", func(c *gin.Context) {
		fmt.Println(c.FullPath())

		s := new(Student)
		if err := c.ShouldBindQuery(s); err != nil {
			log.Fatal(err.Error())
			return
		} else {
			fmt.Printf("%#v \n", s)
		}

	})
	engine.Run()

}


[GIN-debug] Listening and serving HTTP on :8080
/hello
&main.Student{Name:"lucas", Class:"软件工程"} 
[GIN] 2023/04/27 - 16:23:18 | 200 |       521.7µs |       127.0.0.1 | GET      "/hello?name=lucas&class=%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B"

type Student struct {
	Name  string `form:"name"`
	Class string `form:"class"`
}

 (2)post请求shouldbind方法 表单提交

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
)

type Register struct {
	Username string `form:"username"`
	Phone    string `form:"phone"`
	Password string `form:"password"`
}

func main() {
	engine := gin.Default()
	engine.POST("/register", func(c *gin.Context) {
		r := new(Register)
		if err := c.ShouldBind(r); err != nil {
			log.Fatal(err.Error())
			return
		} else {
			fmt.Printf("%#v", r)
		}
	})

	engine.Run()
}


[GIN-debug] POST   /register                 --> main.main.func1 (3 handlers)   
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend yo
&main.Register{Username:"lucas", Phone:"18270893704", Password:"kubernetes"}[GIN] 2023/04/27 - 19:42:34 | 200 |      1.3004ms | 

(3)处理json格式的数据

目前很多的团队都是使用json格式来进行开发的,提交数据的时候是使用json格式提交,返回也是使用json格式进行返回。

提交时候注意:提交的数据类型和服务器端定义的结构体字段类型保持一致,否则会报错。

上面就是全部对客户端提交数据的解析过程

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/130402326