「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
前言
上篇主要讲了gin框架的基础使用,包括参数的几个获取方式,这一篇继续深入解析数据的其他绑定方式,包括对应的响应方式。主要都是围绕设置请求结构体,绑定前端传递过来的参数,形成对应的实体。
数据绑定
- json数据的解析和绑定 ShouldBindJSON
这个方式是前端通过设置请求头为application/json 方式,然后向发起请求,后端这个时候的设置接口为
先定义接收数据的结构体
// 定义接收数据的结构体
type Login struct {
UserName string `form:"username" json:"userName" uri:"userName" xml:"userName" binding:"required"`
Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}
然后定义我们的路由接口
// JSON绑定r.POST("loginJSON", func(c *gin.Context) {
// 声明接收的变量
var json Login
// 将request的body中的数据,自动按照json格式解析到结构体
if err := c.ShouldBindJSON(&json); err != nil {
// 返回错误信息 // gin.H封装了生成json数据的工具
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// 判断用户名密码是否正确
if json.User != "admin" || json.Pssword != "123456" {
c.JSON(http.StatusBadRequest, gin.H{"status": "304"})
return
}
c.JSON(http.StatusOK, gin.H{"status": "200"})})
最后我们用postman来测试,输入我们的接口,参数,发起请求就可以看到我们得到的结果就是我们写的。
使用json还需要注意一点,json是有数据类型的,因此对于
{"password": "123"}
和
{"password": 123}
是不同的数据类型,解析需要符合对应的数据类型,否则会出错,所以定义接收参数的时候需要和前端商议好。
-
表单数据的解析和绑定 Bind
r.POST("/loginForm", func(c *gin.Context) {
// 声明接收的变量
var form Login
// Bind()默认解析并绑定form格式
// 根据请求头中content-type自动推断
if err := c.Bind(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return } // 判断用户名密码是否正确
if form.User != "admin" || form.Pssword != "123456" {
c.JSON(http.StatusBadRequest, gin.H{"status": "304"})
return }
c.JSON(http.StatusOK, gin.H{"status": "200"}) })
这种方式需要前端设置请求头为application/x-www-form-urlencoded格式
-
uri数据的解析和绑定 ShouldBindUri
//uri绑定r.GET("/:user/:password", func(c *gin.Context) { // 声明接收的变量 var login Login // Bind()默认解析并绑定form格式 // 根据请求头中content-type自动推断 if err := c.ShouldBindUri(&login); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 判断用户名密码是否正确 if login.User != "admin" || login.Pssword != "123456" { c.JSON(http.StatusBadRequest, gin.H{"status": "304"}) return } c.JSON(http.StatusOK, gin.H{"status": "200"}) })
可以看到这种方式的数据解析和绑定也已经成功响应了,但是相对来说我们还是使用ShouldBindJSON,比较符合我们的习惯。
- 各种数据格式的响应
gin框架可以响应json、结构体、XML、YAML类似于java的properties、ProtoBuf等的格式。
如今开发中大部分使用json格式,这也是比较方便快捷的。
总结
现在掌握了gin框架路由的使用、各种数据的绑定和响应,已经可以开发大部分接口业务了,然后可以很方便的启动一个服务。