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 结构体
// User 定义结构体,注意首字母大写
type User struct {
Username string `form:"username" json:"user"`
Password string `form:"password" json:"password"`
}
- Get 传值绑定到结构体
// 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 传值绑定到结构体
// 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 参数的结构体
// Article 定义xml参数的结构体
type Article struct {
Title string `xml:"title"`
Content string `xml:"content"`
}
- 定义获取XML参数的API
// 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 数据的结构体
// RequestBody 定义json参数的结构体
type RequestBody struct {
Name string `json:"name"`
Email string `json:"email"`
}
- 定义获取JSON参数的API
// 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