Golang Gin 框架参数解析介绍(三)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 目录• 前言• 正文• Query 参数解析• Multipart/Urlencoded Form 参数解析• query + post form 参数解析• Map 参数解析• 结尾前言Gin 是使用纯 Golang 语言实现的 HTTP Web 框架,Gin 的接口设计简洁,性能极高,现在被广泛使用。今天,我们就来详细看看 Gin 是如何进行参数解析的。

目录

  • 前言
  • 正文
  • Query 参数解析
  • Multipart/Urlencoded Form 参数解析
  • query + post form 参数解析
  • Map 参数解析
  • 结尾

前言

Gin 是使用纯 Golang 语言实现的 HTTP Web 框架,Gin 的接口设计简洁,性能极高,现在被广泛使用。今天,我们就来详细看看 Gin 是如何进行参数解析的。

正文

Query 参数解析

在所有的请求中,Query 参数属于最常见的一种,下面通过一段代码来看一下,代码如下:

packagemainimport"github.com/gin-gonic/gin"funcmain() {
router :=gin.Default()
router.GET("/welcome", func(c*gin.Context) {
firstname :=c.DefaultQuery("firstname", "Guest")
lastname :=c.Query("lastname") 
c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
    })
router.Run(":8080")
}

上述 API 接口能够匹配类似如下请求的 URL:

/welcome?firstname=Jane&lastname=Doe

上述 Get 请求中,如果 Query 部分缺少参数 firstname,那么 firstname 的值将赋值为“Guest”;但是,如果缺少参数 lastname,那么 lastname 的值为空。

Multipart/Urlencoded Form 参数解析

在所有的请求中,还有 Multipart/Urlencoded Form 类型的参数,下面通过一段代码来理解一下,代码如下:

packagemainimport"github.com/gin-gonic/gin"funcmain() {
router :=gin.Default()
router.POST("/form_post", func(c*gin.Context) {
message :=c.PostForm("message")
nick :=c.DefaultPostForm("nick", "anonymous")
c.JSON(200, gin.H{
"status":  "posted",
"message": message,
"nick":    nick,
        })
    })
router.Run(":8080")
}

上述 Post 请求中,如果 Body 部分缺少参数 nick,那么 nick 的值将赋值为“anonymous”;但是,如果缺少参数 message,那么 message 的值为空。

query + post form 参数解析

有些请求可能同时含有 query 参数和 post form 参数,比如:

POST /post?id=1234&page=1 HTTP/1.1

Content-Type: application/x-www-form-urlencoded

name=manu&message=this_is_great

代码实例:

packagemainimport"github.com/gin-gonic/gin"funcmain() {
router :=gin.Default()
router.POST("/post", func(c*gin.Context) {
id :=c.Query("id")
page :=c.DefaultQuery("page", "0")
name :=c.PostForm("name")
message :=c.PostForm("message")
fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)
    })
router.Run(":8080")
}

由上面的例子可以看出,解析 Query 类型的参数时,使用的是 Query 方法和 DefaultQuery 方法;解析 post form 类型的参数时,使用的是 PostForm 方法。

Map 参数解析

请求参数中还有一种类型就是 Map 类型,请求实例如下:

POST /post?ids[a]=1234&ids[b]=hello HTTP/1.1

Content-Type: application/x-www-form-urlencoded

names[first]=thinkerou&names[second]=tianou

这种情况该如何解析呢?请看如下代码:

funcmain() {
router :=gin.Default()
router.POST("/post", func(c*gin.Context) {
ids :=c.QueryMap("ids")
names :=c.PostFormMap("names")
fmt.Printf("ids: %v; names: %v", ids, names)
    })
router.Run(":8080")
}

打印结果如下:

ids: map[b:hello a:1234], names: map[second:tianou first:thinkerou]

结尾

好啦,今天介绍了如何利用 Gin 框架解析四种不同参数请求的方法。希望对大家如何熟练使用 Gin 框架有所帮助。



作者简介:大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,同时也是CSDN博客专家、华为云享专家(共创编辑)、InfoQ 签约作者,欢迎关注我分享更多干货!


目录
相关文章
|
3天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
2月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
2月前
|
JSON API 数据格式
requests库中json参数与data参数使用方法的深入解析
选择 `data`或 `json`取决于你的具体需求,以及服务器端期望接收的数据格式。
215 2
|
1月前
|
JSON 应用服务中间件 API
使用 Gin 框架实现文件上传:机制与深入解析
使用 Gin 框架实现文件上传:机制与深入解析
|
1月前
|
存储 缓存 并行计算
yolov5的train.py的参数信息解析
这篇文章解析了YOLOv5的`train.py`脚本中的参数信息,详细介绍了每个参数的功能和默认值,包括权重路径、模型配置、数据源、超参数、训练轮数、批量大小、图像尺寸、训练选项、设备选择、优化器设置等,以便用户可以根据需要自定义训练过程。
28 0
|
2月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
3月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
292 0
|
3月前
|
Go 开发者
|
3月前
|
监控 测试技术 API
|
3月前
|
编译器 Go 开发者
详尽解析:Golang 中的常量及其使用
【8月更文挑战第31天】
83 0