为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString、form表单、JSON、XML等参数到结构体中。
在Go中,通过反射解析数据都是存放在结构体中,所以我们先定义一个结构体用来接受数据,如下:
type Login struct{User string `form:"username" json:"username" xml:"username" binding:"required"`Password string `form:"username" json:"username" xml:"username" binding:"required"`}
其中 :
- form:会去解析form表单数据
- json:会去解析json格式数据
- xml:会去解析xml格式数据
- binding:required表示设置的参数是必须参数,如果没有传就会报错
解析JSON数据
package mainimport ("github.com/gin-gonic/gin""net/http")type Login struct{User string `form:"username" json:"username" xml:"username" binding:"required"`Password string `form:"password" json:"password" xml:"password" binding:"required"`}func main(){// 1、创建路由g := gin.Default()// 2、绑定路由规则g.POST("/loginJSON", func(context *gin.Context) {var login Login// 对参数进行绑定if err := context.ShouldBindJSON(&login);err != nil{// 如果有错误返回JSON数据context.JSON(304,gin.H{"status": err.Error()})}// 如果没有报错,取值并返回context.JSON(200,gin.H{"status": http.StatusOK,"username": login.User,"password": login.Password,})})g.Run(":8000")}
测试看结果:
(1)、正常请求
(2)、错误请求
解析Form表单
package mainimport ("github.com/gin-gonic/gin""net/http")type Login struct{User string `form:"username" json:"username" xml:"username" binding:"required"`Password string `form:"password" json:"password" xml:"password" binding:"required"`}func main(){// 1、创建路由g := gin.Default()// 2、绑定路由规则g.POST("/loginFORM", func(context *gin.Context) {var login Login// 对参数进行绑定if err := context.ShouldBind(&login);err != nil{// 如果有错误返回JSON数据context.JSON(304,gin.H{"status": err.Error()})}// 如果没有报错,取值并返回context.JSON(200,gin.H{"status": http.StatusOK,"username": login.User,"password": login.Password,})})g.Run(":8000")}

解析URL数据
package mainimport ("github.com/gin-gonic/gin""net/http")type Login struct{User string `form:"username" json:"username" xml:"username" uri:"username" binding:"required"`Password string `form:"password" json:"password" xml:"password" uri:"password" binding:"required"`}func main(){// 1、创建路由g := gin.Default()// 2、绑定路由规则g.GET("/:username/:password", func(context *gin.Context) {var login Login// 对参数进行绑定if err := context.ShouldBindUri(&login);err != nil{// 如果有错误返回JSON数据context.JSON(304,gin.H{"status": err.Error()})}// 如果没有报错,取值并返回context.JSON(200,gin.H{"status": http.StatusOK,"username": login.User,"password": login.Password,})})g.Run(":8000")}

解析queryString数据
package mainimport ("github.com/gin-gonic/gin""net/http")type Login struct{User string `form:"username" json:"username" xml:"username" uri:"username" binding:"required"`Password string `form:"password" json:"password" xml:"password" uri:"password" binding:"required"`}func main(){// 1、创建路由g := gin.Default()// 2、绑定路由规则g.GET("/login", func(context *gin.Context) {var login Login// 对参数进行绑定if err := context.ShouldBind(&login);err != nil{// 如果有错误返回JSON数据context.JSON(304,gin.H{"status": err.Error()})}// 如果没有报错,取值并返回context.JSON(200,gin.H{"status": http.StatusOK,"username": login.User,"password": login.Password,})})g.Run(":8000")}

