go-gin框架-数据绑定与响应

383 阅读3分钟

「这是我参与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框架路由的使用、各种数据的绑定和响应,已经可以开发大部分接口业务了,然后可以很方便的启动一个服务。