gin框架的参数绑定

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

/*
ShouldBind的强大之处: 不关是json类型的数据 还是form表单 还是query String 那种格式 你会发现代码都一样的
ShouldBind能根据请求中ContentType类型 来决定我们采用什么方式
	如果你传来queryString 类型参数 我就用queryString去取
	如果你使用form表单提交 那我也按照form表的形式去取数据
	如果你是用json格式的数据发起请求 那我就按照json格式的数据去取请求里的参数
 */

//使用tag 使用户传来的u的属性、类型等 结构体里面的属性等相关联
type UserInfo struct {
	Username string `form: "username" json: "user"`
	Password string `form: "password" json: "pwd"`
}

func main() {
	r := gin.Default()
	r.LoadHTMLFiles("./index.html")

	r.GET("/user", func(c *gin.Context) {
		/*username := c.Query("username")
		password := c.Query("password")
		u := UserInfo{
			username: username,
			password: password,
		}*/

		var u UserInfo  //声明一个UserInfo类型的变量  它去看UserInfo里面有哪些字段 然后一个一个去请求里面找
		//调用此函数想要完成的事情是:把请求里面所有跟username、password等相关的值取出来  然后赋值给u
		//这里面就涉及到 你将会在ShouldBind 里面修改u的值了 由于GO语言方法/函数 传递的都是值拷贝 这里的u只是个副本
		//因此 应该把 u的地址传给ShouldBind  拿到这个地址才能修改u的值
		//还有个问题就是 你不知道用户传来的u的属性、类型等是啥 怎么跟自定义的结构体里面的属性相关联呢?
		//此时用到反射 在运行时 动态地获取传来的参数是啥类型以及它的属性都有啥 也就是使用tag 并让属性名首字母大写
		err := c.ShouldBind(&u)
		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		}else {
			fmt.Printf("%#v\n", u)
			c.JSON(http.StatusOK, gin.H{
				"status": "ok",
			})
		}

		c.JSON(http.StatusOK, gin.H{
			"message": "ok",
		})
	})

	r.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})

	r.POST("/form", func(c *gin.Context) {
		var u UserInfo  //声明一个UserInfo类型的变量  它去看UserInfo里面有哪些字段 然后一个一个去请求里面找
		err := c.ShouldBind(&u)
		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		}else {
			fmt.Printf("%#v\n", u)
			c.JSON(http.StatusOK, gin.H{
				"status": "ok",
			})
		}
	})

	r.POST("/json", func(c *gin.Context) {
		var u UserInfo  //声明一个UserInfo类型的变量  它去看UserInfo里面有哪些字段 然后一个一个去请求里面找
		err := c.ShouldBind(&u)
		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		}else {
			fmt.Printf("%#v\n", u)
			c.JSON(http.StatusOK, gin.H{
				"status": "ok",
			})
		}
	})
	r.Run(":9090")
}

发布了100 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_37767455/article/details/104692034