为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryStringform表单JSONXML等参数到结构体中。

在Go中,通过反射解析数据都是存放在结构体中,所以我们先定义一个结构体用来接受数据,如下:

  1. type Login struct{
  2. User string `form:"username" json:"username" xml:"username" binding:"required"`
  3. Password string `form:"username" json:"username" xml:"username" binding:"required"`
  4. }

其中 :

  • form:会去解析form表单数据
  • json:会去解析json格式数据
  • xml:会去解析xml格式数据
  • binding:required表示设置的参数是必须参数,如果没有传就会报错

解析JSON数据

  1. package main
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. )
  6. type Login struct{
  7. User string `form:"username" json:"username" xml:"username" binding:"required"`
  8. Password string `form:"password" json:"password" xml:"password" binding:"required"`
  9. }
  10. func main(){
  11. // 1、创建路由
  12. g := gin.Default()
  13. // 2、绑定路由规则
  14. g.POST("/loginJSON", func(context *gin.Context) {
  15. var login Login
  16. // 对参数进行绑定
  17. if err := context.ShouldBindJSON(&login);err != nil{
  18. // 如果有错误返回JSON数据
  19. context.JSON(304,gin.H{"status": err.Error()})
  20. }
  21. // 如果没有报错,取值并返回
  22. context.JSON(200,gin.H{
  23. "status": http.StatusOK,
  24. "username": login.User,
  25. "password": login.Password,
  26. })
  27. })
  28. g.Run(":8000")
  29. }

测试看结果:
(1)、正常请求
image.png
(2)、错误请求
image.png

解析Form表单

  1. package main
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. )
  6. type Login struct{
  7. User string `form:"username" json:"username" xml:"username" binding:"required"`
  8. Password string `form:"password" json:"password" xml:"password" binding:"required"`
  9. }
  10. func main(){
  11. // 1、创建路由
  12. g := gin.Default()
  13. // 2、绑定路由规则
  14. g.POST("/loginFORM", func(context *gin.Context) {
  15. var login Login
  16. // 对参数进行绑定
  17. if err := context.ShouldBind(&login);err != nil{
  18. // 如果有错误返回JSON数据
  19. context.JSON(304,gin.H{"status": err.Error()})
  20. }
  21. // 如果没有报错,取值并返回
  22. context.JSON(200,gin.H{
  23. "status": http.StatusOK,
  24. "username": login.User,
  25. "password": login.Password,
  26. })
  27. })
  28. g.Run(":8000")
  29. }

image.png

解析URL数据

  1. package main
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. )
  6. type Login struct{
  7. User string `form:"username" json:"username" xml:"username" uri:"username" binding:"required"`
  8. Password string `form:"password" json:"password" xml:"password" uri:"password" binding:"required"`
  9. }
  10. func main(){
  11. // 1、创建路由
  12. g := gin.Default()
  13. // 2、绑定路由规则
  14. g.GET("/:username/:password", func(context *gin.Context) {
  15. var login Login
  16. // 对参数进行绑定
  17. if err := context.ShouldBindUri(&login);err != nil{
  18. // 如果有错误返回JSON数据
  19. context.JSON(304,gin.H{"status": err.Error()})
  20. }
  21. // 如果没有报错,取值并返回
  22. context.JSON(200,gin.H{
  23. "status": http.StatusOK,
  24. "username": login.User,
  25. "password": login.Password,
  26. })
  27. })
  28. g.Run(":8000")
  29. }

image.png

解析queryString数据

  1. package main
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. )
  6. type Login struct{
  7. User string `form:"username" json:"username" xml:"username" uri:"username" binding:"required"`
  8. Password string `form:"password" json:"password" xml:"password" uri:"password" binding:"required"`
  9. }
  10. func main(){
  11. // 1、创建路由
  12. g := gin.Default()
  13. // 2、绑定路由规则
  14. g.GET("/login", func(context *gin.Context) {
  15. var login Login
  16. // 对参数进行绑定
  17. if err := context.ShouldBind(&login);err != nil{
  18. // 如果有错误返回JSON数据
  19. context.JSON(304,gin.H{"status": err.Error()})
  20. }
  21. // 如果没有报错,取值并返回
  22. context.JSON(200,gin.H{
  23. "status": http.StatusOK,
  24. "username": login.User,
  25. "password": login.Password,
  26. })
  27. })
  28. g.Run(":8000")
  29. }

image.png