Loading

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")
}

image-20210306163942794

多文件上传

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)),
		})
	})
posted @ 2022-05-27 14:40  nsfoxer  阅读(83)  评论(0编辑  收藏  举报