ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

3_请求参数绑定与多数据格式处理.md

2022-05-26 10:35:08  阅读:208  来源: 互联网

标签:username md form 绑定 参数 gin 数据格式 address


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

标签:username,md,form,绑定,参数,gin,数据格式,address
来源: https://www.cnblogs.com/nsfoxer/p/16312558.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有