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")
}
gin框架的参数绑定
最新推荐文章于 2024-07-01 12:08:00 发布