为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的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 main
import (
"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 main
import (
"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 main
import (
"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 main
import (
"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")
}