前面我们演示Gin web框架获取的参数其实都是form格式的,但是在实际的开发过程中经常会遇到前端传递的参数是json格式的,此时我们如何做呢?
这个也比较简单,首先我们把json格式的结构体给声明出来,例如前面的login接口,这里接收一个username和password的参数,所以我们声明一个结构体来定义这个json数据结构。示例如下:
type Reqe struct { Username string `json:"username"` Password string `json:"password"` }
然后我们在gin里面使用的时候,去解析前端传递的json结构主要分为3步:
1、创建结构体对象 2、使用json包进行序列化 3、绑定json结构体
具体使用示例如下:
var req = Reqe{} json.NewDecoder(c.Request.Body).Decode(&req) c.ShouldBind(&req)
然后我们就可以使用结构体来取值了,例如:
username := req.Username password := req.Password
最后我们奉上改造后的login代码:
//用户登录 router.POST("/login", func(c *gin.Context) { var req = Reqe{} json.NewDecoder(c.Request.Body).Decode(&req) c.ShouldBind(&req) username := req.Username password := req.Password log.Println("获取到的用户名和密码是:", username, password) rows, err := db.Query("SELECT id FROM users WHERE username = ? and password = ?", username, password) if err != nil { panic(err.Error()) } defer rows.Close() if rows.Next() == true { Ok(c, 200, "登录成功", nil) } else { Error(c, 400, "用户名或者密码不正确") } })
然后运行起来,前端传递json:
测试完全没有问题。
备注:
1、这里绑定结构体的时候一定要使用ShouldBind,因为使用ShouldBind最后返回的http状态码才是200,如果是Bind的话,返回的http码是400
还没有评论,来说两句吧...