3_请求参数绑定与多数据格式处理.md
Gin请求参数绑定与多数据格式处理
目录
表单实体绑定(参数绑定)
使用PostForm这种单个获取属性和字段的方式,代码量较多,需要一个一个属性进行获取。gin框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率:
type UserRegister struct {
Username string `form:"username" binding:"required"`
Phone string `form:"phone" binding:"required"`
Password string `form:"password" binding:"required"`
}
ShouldBindQuery()
使用ShouldBindQuery可以实现Get方式的数据请求的绑定。
func func3() {
r := gin.Default()
r.GET("/hello", func(c *gin.Context) {
fmt.Println(c.FullPath())
var student Student
// ShouldBind()会根据请求的Content-Type自行选择绑定器
err := c.ShouldBindQuery(&student)
if err != nil {
log.Fatal(err.Error())
}
c.Writer.Write([]byte("hello, " + student.Name + student.Classes))
})
r.Run("localhost:8000")
}
type Student struct {
Name string `form:"name"`
Classes string `form:"classes"`
}
ShouldBind()
使用ShouldBind可以实现Post方式的提交数据的绑定工作。
ShouldBindJson()
当客户端使用Json格式进行数据提交时,可以采用ShouldBindJson对数据进行绑定并自动解析
参数获取
获取querystring参数
DefaultQuery()
Query()
r.GET("/user/search", func(c *gin.Context) {
username := c.DefaultQuery("username", "小王子")
//username := c.Query("username")
address := c.Query("address")
//输出json结果给调用方
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
})
})
获取form参数
PostForm()
username := c.PostForm("username")
address := c.PostForm("address")
获取json参数
r.POST("/json", func(c *gin.Context) {
// 注意:下面为了举例子方便,暂时忽略了错误处理
b, _ := c.GetRawData() // 从c.Request.Body读取请求数据
// 定义map或结构体
var m map[string]interface{}
// 反序列化
_ = json.Unmarshal(b, &m)
c.JSON(http.StatusOK, m)
})
请求的参数通过URL路径传递,例如:/user/search/小王子/沙河
。 获取请求URL路径中的参数的方式如下。
func main() {
//Default返回一个默认的路由引擎
r := gin.Default()
r.GET("/user/search/:username/:address", func(c *gin.Context) {
username := c.Param("username")
address := c.Param("address")
//输出json结果给调用方
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
})
})
r.Run(":8080")
}
Gin文件上传
单文件上传
文件上传前端页面代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title>上传文件示例</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="f1">
<input type="submit" value="上传">
</form>
</body>
</html>
后端gin框架部分代码:
gin.Context.FormFile()
func main() {
router := gin.Default()
// 处理multipart forms提交文件时默认的内存限制是32 MiB
// 可以通过下面的方式修改
// router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
file, err := c.FormFile("f1")
if err != nil {
c.JSON(302, gin.H{
"message": err.Error(),
})
return
}
fmt.Println(file.Filename)
dst := fmt.Sprintf("./%s", file.Filename)
c.SaveUploadedFile(file, dst)
c.JSON(200, gin.H{
"message": fmt.Sprintf("'%s' uploaded!", file.Filename),
})
})
router.LoadHTMLFiles("./index.html")
router.GET("/", func (c *gin.Context) {
c.HTML(200, "index.html", "")
})
router.Run("localhost:9000")
}
多文件上传
gin.Context.MultipartForm()
router.POST("/upload", func(c *gin.Context) {
// Multipart form
form, _ := c.MultipartForm()
files := form.File["file"]
for index, file := range files {
log.Println(file.Filename)
dst := fmt.Sprintf("C:/tmp/%s_%d", file.Filename, index)
// 上传文件到指定的目录
c.SaveUploadedFile(file, dst)
}
c.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("%d files uploaded!", len(files)),
})
})