zoukankan      html  css  js  c++  java
  • 模型绑定

    模型绑定可以将请求体绑定给一个类型。目前Gin支持JSON、XML、YAML和标准表单值的绑定。简单来说,就是根据Body数据类型,将数据赋值到指定的结构体变量中 (类似于序列化和反序列化) 。

    Gin提供了两套绑定方法:

    • Must bind
      • 方法:Bind,BindJSON,BindXML,BindQuery,BindYAML
      • 行为:这些方法使用MustBindWith。如果存在绑定错误,则用c终止请求,使用c.AbortWithError (400) .SetType (ErrorTypeBind)即可。将响应状态代码设置为400,Content-Type header设置为text/plain;charset = utf - 8。请注意,如果在此之后设置响应代码,将会受到警告:[GIN-debug][WARNING] Headers were already written. Wanted to override status code 400 with 422将导致已经编写了警告[GIN-debug][warning]标头。如果想更好地控制行为,可以考虑使用ShouldBind等效方法。
    • Should bind
      • 方法:ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML
      • 行为:这些方法使用ShouldBindWith。如果存在绑定错误,则返回错误,开发人员有责任适当地处理请求和错误。

    注意,使用绑定方法时,Gin 会根据请求头中 Content-Type 来自动判断需要解析的类型。如果你明确绑定的类型,你可以不用自动推断,而用 BindWith 方法。 你也可以指定某字段是必需的。如果一个字段被 binding:"required" 修饰而值却是空的,请求会失败并返回错误。

    JSON的绑定,其实就是将request中的Body中的数据按照JSON格式进行解析,解析后存储到结构体对象中。

    package main
     
    import (
        "github.com/gin-gonic/gin"
        "net/http"
    )
     
    type Login struct {
        User     string `form:"username" json:"user" uri:"user" xml:"user"  binding:"required"`
        Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
    }
     
    func main() {
        router := gin.Default()
        //1.binding JSON
        // Example for binding JSON ({"user": "hanru", "password": "hanru123"})
        router.POST("/loginJSON", func(c *gin.Context) {
            var json Login
            //其实就是将request中的Body中的数据按照JSON格式解析到json变量中
            if err := c.ShouldBindJSON(&json); err != nil {
                c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
                return
            }
            if json.User != "hanru" || json.Password != "hanru123" {
                c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
                return
            }
            c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
        })
     
        router.Run(":8080")
    }
    

    前面我们使用c.String返回响应,顾名思义则返回string类型。content-type是plain或者text。调用c.JSON则返回json数据。其中gin.H封装了生成json的方式,是一个强大的工具。使用golang可以像动态语言一样写字面量的json,对于嵌套json的实现,嵌套gin.H即可。

    // 从 JSON 绑定
    type Login struct {
        User     string `form:"user" json:"user" binding:"required"`
        Password string `form:"password" json:"password" binding:"required"`
    }
    
    func main() {
        router := gin.Default()
    
        // 绑定 JSON 的示例 ({"user": "manu", "password": "123"})
        router.POST("/loginJSON", func(c *gin.Context) {
            var json Login
            if err := c.ShouldBindJSON(&json); err == nil {
                if json.User == "manu" && json.Password == "123" {
                    c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
                } else {
                    c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
                }
            } else {
                c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            }
        })
    
        // 一个 HTML 表单绑定的示例 (user=manu&password=123)
        router.POST("/loginForm", func(c *gin.Context) {
            var form Login
            // 这个将通过 content-type 头去推断绑定器使用哪个依赖。
            if err := c.ShouldBind(&form); err == nil {
                if form.User == "manu" && form.Password == "123" {
                    c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
                } else {
                    c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
                }
            } else {
                c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            }
        })
    
        // 监听并服务于 0.0.0.0:8080
        router.Run(":8080")
    }
    

      

  • 相关阅读:
    ajax收藏
    excel提取文本格式时分秒中数字的方法并计算成秒的公式
    vi编辑模式中按方向键变ABCD的解决方法
    IIS配置Url重写实现http自动跳转https的重定向方法
    IIS中启用目录浏览功能后不能下载未知扩展名文件的解决方法
    Nginx禁止IP访问,只允许域名访问
    nginx在Window平台http自动跳转https设置方法
    通过清理注册表方式清理window远程连接的历史记录
    DOS批处理添加IP域名,备份与恢复
    windows修改snmp端口号方法
  • 原文地址:https://www.cnblogs.com/yzg-14/p/13143443.html
Copyright © 2011-2022 走看看