6.Gin 路由详解 - GET POST 请求以及参数获取示例

2023-11-20 14:36:17 浏览数 (1)

6.Gin 路由详解 - GET POST 请求以及参数获取示例

GET POST 请求以及参数获取示例

Get 请求:获取 Quary 参数

代码语言:javascript复制
// 获取query参数示例:GET /user?uid=20&name=jack&page=1
r.GET("/user", func(c *gin.Context) {
    // 获取参数
    // Query获取参数
    uid := c.Query("uid")
    username := c.Query("name")
    // DefaultQuery获取参数,可以设置默认值:也就是如果没有该参数,则使用默认值
    page := c.DefaultQuery("page", "1")

    // 返回JSON结果
    c.JSON(http.StatusOK, gin.H{
       "uid":      uid,
       "username": username,
       "page":     page,
    })
})

测试如下:

1696261337707

Get请求:动态路由,获取 Path 参数

代码语言:javascript复制
// GET 获取path路径参数
r.GET("/book/:bid", func(c *gin.Context) {
    // 获取path参数
    bid := c.Param("bid")
    // 返回响应信息
    c.JSON(http.StatusOK, gin.H{
       "message": fmt.Sprintf("bid=%s", bid),
    })
})

测试如下:

1696262492501

Post请求:获取 form 表单数据

为了简单演示,直接使用 apifox 执行 form 表单的请求。

代码语言:javascript复制
// POST 请求示例:获取 form 表单的参数
r.POST("/addUser", func(c *gin.Context) {
    // 获取form表单参数
    // 使用PostForm获取单个参数
    username := c.PostForm("username")
    // DefaultPostForm如果没有设置该参数,则取默认值
    gender := c.DefaultPostForm("gender", "male")
    // PostFormArray 获取字符串数组参数
    hobby := c.PostFormArray("hobby")
    // 返回响应结果
    c.JSON(http.StatusOK, gin.H{
       "username": username,
       "gender":   gender,
       "hobby":    hobby,
    })
})

测试如下:

1696263335027

获取 GET POST 传递的参数数据,绑定到结构体

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

下面的示例代码演示了.ShouldBind()强大的功能,它能够基于请求自动提取 JSON、form 表单和 QueryString 类型的数据,并把值绑定到指定的结构体对象

代码示例:

  • 定义 User 结构体
代码语言:javascript复制
// User 定义结构体,注意首字母大写
type User struct {
    Username string `form:"username" json:"user"`
    Password string `form:"password" json:"password"`
}
  • Get 传值绑定到结构体
代码语言:javascript复制
// Get 传值绑定到结构体 /userinfo?username=jackson&password=123456
r.GET("/userinfo", func(c *gin.Context) {
    // 创建user对象
    var userinfo User
    // 使用ShouldBind绑定参数至对象
    if err := c.ShouldBind(&userinfo); err == nil {
       // 绑定成功,则返回结果
       c.JSON(http.StatusOK, userinfo)
    } else {
       // 绑定失败,则返回错误信息
       c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    }
})

测试如下:

1696264565233

  • Post 传值绑定到结构体
代码语言:javascript复制
// Post 传值绑定到结构体
r.POST("/login", func(c *gin.Context) {
    // 创建user对象
    var userinfo User
    // 使用ShouldBind绑定参数至对象
    if err := c.ShouldBind(&userinfo); err == nil {
       // 绑定成功,则返回结果
       c.JSON(http.StatusOK, userinfo)
    } else {
       // 绑定失败,则返回错误信息
       c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    }
})

测试如下:

1696264705121

获取 Post Xml 数据

在 API 的开发中,我们经常会用到 JSON 或 XML 来作为数据交互的格式,这个时候我们可以在 gin 中使用 c.GetRawData()获取请求体的数据。

获取 XML 数据
  • 定义 XML 参数的结构体
代码语言:javascript复制
// Article 定义xml参数的结构体
type Article struct {
    Title string `xml:"title"`
    Content string `xml:"content"`
}
  • 定义获取XML参数的API
代码语言:javascript复制
// Post 获取 XML 请求体参数
r.POST("/xml", func(c *gin.Context) {
    // 从 c.Request.Body 读取请求数据
    body, _ := c.GetRawData()
    // 初始化结构体对象
    article := &Article{}
    // 使用xml.Unmarshal绑定参数至对象
    if err := xml.Unmarshal(body, &article); err == nil {
       // 绑定成功,则返回结果
       c.JSON(http.StatusOK, article)
    } else {
       // 绑定失败,则返回错误信息
       c.JSON(http.StatusBadRequest, err.Error())
    }
})
  • 测试请求xml参数

1696265111439

请求体如下:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<article>
    <content type="string">AI大时代</content>
    <title type="string">ChatGPT全解析</title>
</article>
获取 JSON 数据
  • 定义 JSON 数据的结构体
代码语言:javascript复制
// RequestBody 定义json参数的结构体
type RequestBody struct {
    Name  string `json:"name"`
    Email string `json:"email"`
}
  • 定义获取JSON参数的API
代码语言:javascript复制
// POST 获取 JSON 请求体参数
r.POST("/api/parsejson", func(c *gin.Context) {
    // 创建请求体的对象
    var reqBody RequestBody

    // 使用 ShouldBindJSON 将 JSON 请求体绑定到结构体
    if err := c.ShouldBindJSON(&reqBody); err != nil {
       // 如果解析失败,返回错误响应
       c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
       return
    }

    // 打印解析后的参数
    fmt.Printf("Name: %sn", reqBody.Name)
    fmt.Printf("Email: %sn", reqBody.Email)

    // 返回成功响应
    c.JSON(http.StatusOK, gin.H{
       "message": "JSON body parsed successfully",
       "reqBody": reqBody,
    })
})
  • 测试请求如下

1696265562524

0 人点赞