• 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)),
    		})
    	})
    
  • 相关阅读:
    git常用命令总结
    sublime text文本中文显示繁体字修改设置
    正则表达式规则玩法
    网址总结
    维度灾难的问题
    Mybatis使用Map当做参数获取插入数据成功后返回的自增id
    Cenos7安装破解jira
    Linux下安装mysql-5.7.28详细步骤
    使用通用mapper时报错,tk.mybatis.mapper.MapperException:无法获取实体类xxx对应的表名!
    Mysql插入数据时,报错this is incompatible with sql_mode=only_full_group_by
  • 原文地址:https://www.cnblogs.com/nsfoxer/p/16317575.html
Copyright © 2020-2023  润新知