之前学习了使用Gin框架的Engine的默认路由功能解析HTTP请求。现在我们来学习gin框架的参数绑定操作和请求结果返回格式。
处理POST请求时,使用context.PostForm或者context.DefaultPostForm获取客户端表单提交的数据。
像上述这种只有username和password两个字段的表单数据进行提交时,可以使用context.PostForm 和context.GetPostForm获取。
但是如果表单数据较多时,使用PostForm和GetPostForm一次获取一个表单数据,开发效率较慢。
在实际的开发过程当中,往往会面对非常复杂的业务逻辑,比如提交某个数据的时候,需要很多的字段,很多的属性,比如提交用户注册表单,需要用户名注册密码,身份证信息,手机号,昵称等等。如果还是使用上面这种方式获取字段属性,这样就显得效率有些低了。
Gin框架提供给开发者表单实体绑定的功能,可以将表单数据与结构体绑定。(其实也就是将表单提交的数据直接映射为结构体实体)
表单实体绑定
使用PostForm这种单个获取属性和字段的方式,代码量较多,需要一个一个属性进行获取。而表单数据的提交,往往对应着完整的数据结构体定义,其中对应着表单的输入项。gin框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率。如下所示:
以一个用户注册功能来进行讲解表单实体绑定操作。用户注册需要提交表单数据,假设注册时表单数据包含三项,分别为:username、phone、password。
创建了UserRegister结构体用于接收表单数据,通过tag标签的方式设置每个字段对应的form表单中的属性名,通过binding属于设置属性是否是必须。
如果结构体字段是username,form标签是name,那么就是结构体字段username字段和表单name绑定。
结构体里面的属性对应我们提交表单里面的哪些字段?通过后面的tag标签来设定。这里面有form的属性,这个表示要对应到http请求当中表单当中的哪一个字段。
可以看到Username对应的是表单当中的username字段。
代码如下 get请求方式 post请求方式
下面是三种表单实体绑定的方式,分别是get请求方式,其次是post请求方式。在post请求方式里面讲两种,其中一种是mutiform格式,其次是json格式。
(1)get请求 表单数据提交和服务端具体结构体的定义相应绑定操作 c.ShouldBindQuery
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"log"
)
type Student struct {
Name string `form:"name"`
Class string `form:"class"`
}
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"
** (2)post请求shouldbind方法 表单提交 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格式的数据 c.BindJSON
目前很多的团队都是使用json格式来进行开发的,提交数据的时候是使用json格式提交,返回也是使用json格式进行返回。
提交时候注意:提交的数据类型和服务器端定义的结构体字段类型保持一致,否则会报错。
上面就是全部对客户端提交数据的解析过程
版权归原作者 富士康质检员张全蛋 所有, 如有侵权,请联系我们删除。