当前位置: 首页 > news >正文

Gin从入门到精通 (四)请求参数

请求参数

在web中,请求参数的来源多种多样,常见的有 URL 查询参数、表单参数、JSON 数据、路径参数等。下面将详细介绍不同类型请求参数的处理方式

1.查询参数

URL 查询参数通常出现在 URL 的 ? 后面,多个参数之间用 & 分隔。在 Gin 中,可以使用 c.Queryc.DefaultQuery 方法来获取这些参数。

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/search", func(c *gin.Context) {
        // 使用 c.Query 获取参数,如果参数不存在则返回空字符串
        keyword := c.Query("keyword")
        // 使用 c.DefaultQuery 获取参数,如果参数不存在则返回默认值
        page := c.DefaultQuery("page", "1")

        c.JSON(200, gin.H{
            "keyword": keyword,
            "page":    page,
        })
    })

    r.Run(":8080")
}

上面的代码中,c.Query("keyword"):尝试从 URL 查询参数中获取 keyword 的值,如果该参数不存在,则返回空字符串。

c.DefaultQuery("page", "1"):尝试从 URL 查询参数中获取 page 的值,如果该参数不存在,则返回默认值 "1"

请求路径:

http://localhost:8080/search?keyword=go 

返回数据:

{"keyword":"go","page":"1"}

请求路径:

http://localhost:8080/search?keyword=go&page=2

返回数据:

{"keyword":"go","page":"2"}

2.数组参数

在 Gin 中,可以使用 c.QueryArrayc.GetQueryArray 方法来获取数组参数。

第一种方式:

package main

import (
	"github.com/gin-gonic/gin"
)

// User 结构体,用于存储用户信息
type User struct {
	Address []string `form:"address"`
}

func main() {
	r := gin.Default()

	// 第一种方式:使用 QueryArray 获取数组参数
	r.GET("/user/save", func(ctx *gin.Context) {
		address := ctx.QueryArray("address")
		ctx.JSON(200, address)
	})
	// 第二种方式:使用 GetQueryArray 获取数组参数
	r.GET("/user/save1", func(ctx *gin.Context) {
		address, ok := ctx.GetQueryArray("address")
		fmt.Println(ok)
		ctx.JSON(200, address)
	})

	r.Run(":8080")
}

ctx.QueryArray("address"):该方法会直接从 URL 查询参数中获取名为 address 的所有值,并将其作为字符串切片返回。若参数不存在,则返回空切片。

ctx.GetQueryArray("address"):此方法除了返回参数值的切片外,还会返回一个布尔值 ok,用于表示是否成功获取到参数。若参数存在,oktrue;反之则为 false

请求路径:

http://localhost:8080/user/save1?address=Beijing&address=shanghai

返回数据:

["Beijing","shanghai"]

3.map参数处理

在 Gin 中,可以使用 c.QueryMapc.GetQueryMap 方法来获取map参数。

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	// 第一种方式:使用 QueryMap 获取 map 参数
	r.GET("/user/map1", func(ctx *gin.Context) {
		addressMap := ctx.QueryMap("addressMap")
		ctx.JSON(200, addressMap)
	})

	// 第二种方式:使用 GetQueryMap 获取 map 参数
	r.GET("/user/map2", func(ctx *gin.Context) {
		addressMap, _ := ctx.GetQueryMap("addressMap")
		ctx.JSON(200, addressMap)
	})

	r.Run(":8080")
}

ctx.QueryMap("addressMap"):该方法会从 URL 查询参数中解析出以 addressMap 为前缀的所有键值对,并将其存储在一个 map[string]string 中返回。

ctx.GetQueryMap("addressMap"):此方法除了返回解析后的 map 外,还会返回一个布尔值,用于表示是否成功获取到参数。

请求路径:

http://localhost:8080/user/map1?addressMap[home]=Beijing&addressMap[company]=shanghai

返回数据:

{"company":"shanghai","home":"Beijing"}

4.表单参数

首先创建form.html,用来演示表单参数,提交到/submit路由


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Submit Form</title>
</head>
<body>
<form action="/submit" method="post">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name"><br>
    <label for="age">Age:</label>
    <input type="text" id="age" name="age"><br>
    <input type="submit" value="Submit">
</form>
</body>
</html>


表单参数通常在 HTML 表单提交时发送,请求方法一般为 POST。在 Gin 中,可以使用 c.PostFormc.DefaultPostForm 方法来获取这些参数。

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.POST("/submit", func(c *gin.Context) {
        // 使用 c.PostForm 获取表单参数,如果参数不存在则返回空字符串
        name := c.PostForm("name")
        // 使用 c.DefaultPostForm 获取表单参数,如果参数不存在则返回默认值
        age := c.DefaultPostForm("age", "0")

        c.JSON(200, gin.H{
            "name": name,
            "age":  age,
        })
    })

    r.Run(":8080")
}

c.PostForm("name"):尝试从表单数据中获取 name 的值,如果该参数不存在,则返回空字符串.c.DefaultPostForm("age", "0"):尝试从表单数据中获取 age 的值,如果该参数不存在,则返回默认值 "0"

例如:
在这里插入图片描述

执行后返回,以下数据:

{"age":"28","name":"clown95"}

5.JSON 数据

当客户端以 JSON 格式发送数据时,在 Gin 中可以使用 c.ShouldBindJSON 方法将 JSON 数据绑定到 Go 结构体上。

package main

import (
	"github.com/gin-gonic/gin"
)

// User 定义用户结构体
type User struct {
	Name string `json:"name"`
	Age  int64  `json:"age"`
}

func main() {
	r := gin.Default()

	r.POST("/user", func(c *gin.Context) {
		var user User
		// 将 JSON 数据绑定到 User 结构体
		if err := c.ShouldBindJSON(&user); err != nil {
			c.JSON(400, gin.H{"error": err.Error()})
			return
		}

		c.JSON(200, gin.H{
			"get_name": user.Name,
			"get_age":  user.Age,
		})
	})

	r.Run(":8080")
}

c.ShouldBindJSON(&user):尝试将请求体中的 JSON 数据绑定到 user 结构体上。如果绑定失败,返回 HTTP 状态码 400 和错误信息。

使用 Postman发送如下 JSON 请求:

请求路径:

http://localhost:8080/user

请求参数:

{
    "name":"clown95",
    "age": 29
}

返回数据:

{
    "get_age": 29,
    "get_name": "clown95"
}

在这里插入图片描述

6.路径参数

路径参数是 URL 路径中的一部分,通常用于表示资源的唯一标识。在 Gin 中,可以使用 c.Param 方法来获取路径参数。

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/user/:id", func(c *gin.Context) {
        // 获取路径参数 id 的值
        id := c.Param("id")

        c.JSON(200, gin.H{
            "user_id": id,
        })
    })

    r.Run(":8080")
}

c.Param("id"):从 URL 路径中获取 id 参数的值。

相关文章:

  • 网络运维学习笔记 022 HCIA-Datacom新增知识点03园区网典型组网架构及案例实战
  • 第一届网谷杯
  • 力扣每日一题【算法学习day.133】
  • 敏捷开发08:如何高效开每日站会(Daily Stand-up Meeting)
  • LEARNING ON LARGE-SCALE TEXT-ATTRIBUTED GRAPHS VIA VARIATIONAL INFERENCE
  • Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
  • NIO-Reactor模型梳理与demo实现
  • Linux 第三次脚本作业
  • 如何使用智能指针来管理动态分配的内存
  • 函数中的形参和实参(吐槽)
  • R 语言科研绘图 --- 散点图-汇总
  • 记录 idea 启动 tomcat 控制台输出乱码问题解决
  • 嵌入式Linux内核底层调试技术Kprobes
  • N32G003查看设备重启原因
  • 洛谷P1135多题解
  • Pytorch使用手册-音频数据增强(专题二十)
  • 显卡(Graphics Processing Unit,GPU)架构详细解读
  • Linux 第二次脚本作业
  • [设计模式] Builder 建造者模式
  • [Windows] 全国油价实时查询,可具体到城市
  • 国家网信办举办在欧中资企业座谈会,就数据跨境流动等进行交流
  • 万达电影去年净利润亏损约9.4亿元,计划未来三年内新增25块IMAX银幕
  • 奈雪的茶叫停“能喝奶茶就不要喝水”宣传,当地市监称不要误导消费者
  • 郭向阳任广东省公安厅分管日常工作副厅长(正厅级)
  • 广东省副省长刘红兵任湖南省委常委、宣传部部长
  • 美的集团一季度净利增长38%,库卡中国机器人接单增超35%