前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >6.Gin 路由详解 - GET POST 请求以及参数获取示例

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

作者头像
Devops海洋的渔夫
发布2023-11-20 14:36:17
6060
发布2023-11-20 14:36:17
举报
文章被收录于专栏:Devops专栏Devops专栏

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: %s\n", reqBody.Name)
    fmt.Printf("Email: %s\n", reqBody.Email)

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

1696265562524

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 6.Gin 路由详解 - GET POST 请求以及参数获取示例
    • GET POST 请求以及参数获取示例
      • Get 请求:获取 Quary 参数
      • Get请求:动态路由,获取 Path 参数
      • Post请求:获取 form 表单数据
      • 获取 GET POST 传递的参数数据,绑定到结构体
      • 获取 Post Xml 数据
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档