目录
- 前言
- 正文
- 结尾
前言
Gin 是使用纯 Golang 语言实现的 HTTP Web 框架,Gin 的接口设计简洁,性能极高,现在被广泛使用。上一篇文章我们介绍了 Gin 框架日志管理模块的相关内容,今天我们就来详细看一看 Gin 在模型绑定方面的内容。
正文
很多和服务器对接的小伙伴,一般都会有这样的疑问:服务器端如何读懂来自客户端的请求?其实,这就需要我们提前定义好 API 接口和消息结构体。其中,API 接口非常好理解,就是我们一般说的消息路由,比如 /ping、/v1/upload 等。那么消息结构体是什么呢?就是我们定义的请求参数类型。这也就是我们今天要讨论的内容,为了更好的解析这些请求参数,Gin 框架设计了参数模型绑定机制,可以非常方便的完成请求参数的解析。
目前,Gin 框架支持四种形式的模型绑定,分别是 JSON, XML, YAML 和标准格式 (比如,foo=bar&boo=baz)。当服务器端需要绑定某种形式时,需要提前定义。比如如果想使用 JSON 类型解析参数 name,就需要提前声明 json:"name"
。
下面看一段代码实例:
// Binding from JSONtypeLoginstruct { Userstring`form:"user" json:"user" xml:"user" binding:"required"`Passwordstring`form:"password" json:"password" xml:"password" binding:"required"`} funcmain() { router :=gin.Default() // 绑定 JSON 类型参数 ({"user": "manu", "password": "123"})router.POST("/loginJSON", func(c*gin.Context) { varjsonLoginiferr :=c.ShouldBindJSON(&json); err!=nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } ifjson.User!="manu"||json.Password!="123" { c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) return } c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) }) // Example for binding XML (// <?xml version="1.0" encoding="UTF-8"?>// <root>// <user>user</user>// <password>123</password>// </root>)router.POST("/loginXML", func(c*gin.Context) { varxmlLoginiferr :=c.ShouldBindXML(&xml); err!=nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } ifxml.User!="manu"||xml.Password!="123" { c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) return } c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) }) // 绑定 HTML 形式的参数 (user=manu&password=123)router.POST("/loginForm", func(c*gin.Context) { varformLogin// This will infer what binder to use depending on the content-type header.iferr :=c.ShouldBind(&form); err!=nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } ifform.User!="manu"||form.Password!="123" { c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) return } c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) }) // 启动服务并监听 8080 端口router.Run(":8080") }
此外,在进行参数模型绑定时,Gin 还提供了两组绑定方法MustBindWith
和 ShouldBindWith
,一种是必须绑定模式,一种是应该绑定模式。前者在发生解析错误时,会直接触发错误返回,后者需要开发者自己进行错误处理。相关的方法如下所示: 必须绑定模式有 Bind
, BindJSON
, BindXML
, BindQuery
, BindYAML
,应该绑定模式有ShouldBind
, ShouldBindJSON
, ShouldBindXML
, ShouldBindQuery
, ShouldBindYAML
。
结尾
好了,今天关于 Gin 框架解析参数模型绑定机制的内容就介绍这么多,如果感兴趣的话,就自己动手是不是吧!希望今天介绍的内容能够帮助到大家,明天再见。
作者简介:大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,同时也是CSDN博客专家、华为云享专家(共创编辑)、InfoQ 签约作者,欢迎关注我分享更多干货!