前面我们演示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


还没有评论,来说两句吧...