【Golang】关于Gin框架请求参数的获取

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Gin框架请求参数的获取
    • 一、请求参数的类型和位置
    • 二、获取请求参数的方法
      • 1. 直接获取请求参数
        • (1)获取URL Path参数
        • (2)获取URL Query参数
        • (3)获取HTTP Body参数
        • (4)获取Header参数
      • 2. 绑定请求参数到结构体
        • (1)绑定URL Query参数到结构体
        • (2)绑定HTTP Body参数到结构体(JSON格式)

Gin框架请求参数的获取

Gin是一个用Go语言编写的Web框架,它提供了强大的路由和中间件功能,使得开发Web应用变得更加简单和高效。
在使用Gin框架开发Web应用时,处理请求参数是一个非常重要的环节。本文将结合实际案例,详细介绍在Go语言中如何使用Gin框架处理请求参数。

一、请求参数的类型和位置

在HTTP请求中,参数可以通过多种方式传递,常见的类型包括:

URL Path参数:参数直接写在请求路径中,例如/user/:id。
URL Query参数:参数跟在URL的?后面,以键值对的形式传递,多个参数之间用&分隔,例如/user/list?name=John&gender=男。
HTTP Body参数:参数在请求体中传递,通常用于POST、PUT等请求方法,内容格式可以是JSON、XML等。
Header参数:参数在HTTP请求头中传递,例如Content-Type、Accept等。

二、获取请求参数的方法

Gin框架提供了多种方法来获取请求参数,包括直接获取和绑定到结构体中两种方式。

1. 直接获取请求参数

(1)获取URL Path参数

URL Path参数是指直接写在请求路径中的参数,可以通过Gin框架的Param方法获取。
后台获取路径请求参数通过ctx.Param(“参数名”) 来获取

示例代码:

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {engine := gin.Default()//请求参数 用:变量名 表示engine.GET("/user/:id", func(ctx *gin.Context) {//后台获取请求参数通过ctx.Param("参数名") 来获取id := ctx.Param("id")//响应到页面//fmt.Fprintf(ctx.Writer, "你的请求id: %s", id)ctx.String(http.StatusOK, "您的id是%s", id)})engine.Run()
}

运行后,发起请求http://localhost:8080/user/100,会返回你的请求id: 100。
在这里插入图片描述

(2)获取URL Query参数

URL Query参数是指跟在URL的?后面的键值对集合,可以通过Gin框架的Query、DefaultQuery、QueryArray、QueryMap等方法获取。

示例代码:

package mainimport ("fmt""github.com/gin-gonic/gin""net/http"
)func main() {engine := gin.Default()engine.GET("/user/list", func(ctx *gin.Context) {name := ctx.Query("name")gender := ctx.DefaultQuery("gender", "男")habits := ctx.QueryArray("habits")fmt.Printf("name: %s, gender: %s, habits: %v\n", name, gender, habits)works := ctx.QueryMap("works")//响应到页面ctx.String(http.StatusOK, "%s, %s, %v, %s\n", name, gender, habits, works)})engine.Run(":8080")
}

运行后,浏览器发起请求
http://127.0.0.1:8080/user/list?name=John&gender=男&habits=reading&habits=sports&works[teacher]=math&works[engineer]=computer
会返回 John, 男, [reading sports], map[engineer:computer teacher:math]
在这里插入图片描述

(3)获取HTTP Body参数

HTTP Body参数是指请求体中的参数,通常用于POST、PUT等请求方法。可以通过Gin框架的PostForm、DefaultPostForm、PostFormArray、PostFormMap等方法获取。

示例代码:

package mainimport ("fmt""github.com/gin-gonic/gin"
)func main() {engine := gin.Default()//使用post请求engine.POST("/user/add", func(ctx *gin.Context) {name := ctx.PostForm("name")gender := ctx.DefaultPostForm("gender", "男")//获取切片数据habits := ctx.PostFormArray("habits")//获取map数据works := ctx.PostFormMap("works")fmt.Printf("%s, %s, %v, %s\n", name, gender, habits, works)})engine.Run()
}

postman发请求
在这里插入图片描述

(4)获取Header参数

Header参数是指HTTP请求头中的参数,可以通过Gin框架的GetHeader方法获取。

示例代码:

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {engine := gin.Default()engine.POST("/getHeader", func(ctx *gin.Context) {//拿到请求头参数数据userAgent := ctx.GetHeader("User-Agent")ctx.String(http.StatusOK, "User-Agent: %s", userAgent)})engine.Run()
}

在这里插入图片描述

2. 绑定请求参数到结构体

Gin框架支持将请求参数自动绑定到结构体中,这样可以更方便地进行参数验证和处理。绑定参数的方法包括Bind、ShouldBind、BindJSON、BindQuery等。

(1)绑定URL Query参数到结构体

示例代码:

package mainimport ("github.com/gin-gonic/gin""net/http"
)// User 定义结构体,使用form标签指定参数名,以便正确地绑定参数 get请求使用功能form标签
type User struct {Id    int64  `form:"id"`Name  string `form:"name"`Age   int    `form:"age"`Email string `form:"email"`
}func main() {engine := gin.Default()engine.GET("/user/info", func(ctx *gin.Context) {var user User//将结构体对象指针传进去if err := ctx.ShouldBindQuery(&user); err != nil {ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}//以json字符串的方式响应给客户端这个结构体对象ctx.JSON(http.StatusOK, user)})engine.Run()
}

在这里插入图片描述

(2)绑定HTTP Body参数到结构体(JSON格式)

当前端请求的数据通过JSON提交时,例如向/json发送一个POST请求

示例代码:

package mainimport ("github.com/gin-gonic/gin""net/http"
)// User 绑定HTTP Body参数到结构体 ,创建结构体时需要用json标签
type User struct {Id    int64  `json:"id"`Name  string `json:"name"`Age   int    `json:"age"`Email string `json:"email"`
}func main() {engine := gin.Default()engine.POST("/user/add", func(ctx *gin.Context) {var user User// ctx.ShouldBindJSON(&user) 将结构体指针传进去if err := ctx.ShouldBindJSON(&user); err != nil {ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}//响应给客户端结构体ctx.JSON(http.StatusOK, user)})engine.Run()
}

在这里插入图片描述

也可以直接获取原生json数据处理

package mainimport ("encoding/json""github.com/gin-gonic/gin""net/http"
)func main() {engine := gin.Default()engine.POST("/json", func(ctx *gin.Context) {// GetRawData : 从c.Request.Body读取请求数据, 返回 []byte// func (c *Context) GetRawData() ([]byte, error)b, _ := ctx.GetRawData()// 定义map或结构体接收var m map[string]interface{}// 将接收的b json反序列化为map数据_ = json.Unmarshal(b, &m)ctx.JSON(http.StatusOK, m)})engine.Run()
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot的网上服装购物商城系统

基于springboot的网上服装购物商城系统 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:idea 源码获取: &#x…

【conda环境打包】ubuntu的conda环境打包导出方法 conda-pack

【conda环境打包】ubuntu的conda环境打包导出方法 conda-pack 1.准备工作2.解压3.后续处理参考文献 1.准备工作 安装conda-pack pip install conda-pack激活要被打包的环境,打包环境之前 先激活要打包的环境 conda activate 被打包的环境打包命令 conda pack --…

Java 输入与输出(I\O)之字节缓冲流【BufferedInputStream】【BufferedOutputStream】详解

缓冲流是Java I/O中的一个重要概念,它可以提高文件读写的性能。 由于磁盘的IO处理速度远低于内存的读写速度。 为了提高文件读写性能,我们可以使用缓冲流。缓冲流使用内存缓冲区,可以一次性读取或写入大量数据,从而减少与磁盘的交…

将图片转换为PDF:Python初学者指南

前言 最近,我去进行了一次入职体检,第二天在体检医院的公众号中查看了体检报告。但遗憾的是,医院没有提供下载功能,而公司需要的是PDF格式的报告。市面上很多工具或软件都能将图片转换为PDF格式,但大多数都要求开会员,而我不常用这些工具,因此没必要为此花钱。出于囊中羞…

华为OD机试真题---关联子串

华为OD机试中的“关联子串”题目是一个考察字符串处理和算法理解的经典问题。以下是对该题目的详细解析: 一、题目描述 给定两个字符串str1 和 str2,如果字符串 str1 中的字符, 经过排列组合后的字符串中只要有一个是 str2 的子串&#xff…

oracle和hive之间关于sql的语法差异及转换

目录 前言 1、oracle中的()写法 1.1、区分左右连接 1.2、hive中的写法 a、最常用 b、副表带条件 c、只显示过滤条件的数据 2、select中含有子查询 3、oracle的decode函数 4、oracle的时间转化 5、oracle的trunc函数 6、oracle instr函数 7…

vscode中每个打开的文件都显示在一个单独的标签页中

版本:1.94 实现步骤: 1、打开设置 File-》Preferences-》Settings 2、具体设置 2.1、在配置中搜索 workbench.editor.showTabs 设置为multiple。 2.2、在配置中搜索 workbench.editor.enablePreview 取消勾选。 根据这个功能的说明,在…

24.10.20(换根哈希)

星期一: 阴间场 cf渡劫成功,拿下三题,终于上蓝🥳🥳🥳 贴 cf round978 div2 C cf传送门 答案取到n1但初始化没到n1,wa了一发,很烦😿…

100. UE5 GAS RPG 显示范围魔法的攻击范围

在这一篇里,我们将制作一个范围魔法,释放魔法时,我们将在鼠标拾取位置绘制一个魔法光圈,用于显示技能释放时攻击的范围,然后再次点击可以释放技能。 创建贴花类 魔法范围标识的光圈,我们采用贴花实现&…

利用飞腾派进行OpenCV开发

实验目标: 完成飞腾平台OpenCV开发。 实验大纲: Mat数据结构加载、显示、保存图像读写像素RGB图像分离彩色图转灰度图 Mat数据结构 Mat是一个类,由两个数据部分组成:矩阵头(大小,通道,数据类型等)和数据块(像素 值)。创建示例…

SQL Server-导入和导出excel数据-注意事项

环境: win10,SQL Server 2008 R2 之前写过的放在这里: SqlServer_陆沙的博客-CSDN博客 https://blog.csdn.net/pxy7896/category_12704205.html 最近重启ASP.NET项目,在使用sql server导出和导入数据时遇到一些问题,特…

LLAMA2入门(一)-----预训练

Llama 2 是预训练和微调的LLM系列,Llama 2 和 Llama 2-Chat 模型的参数规模达到 70B。Llama 2-Chat 模型专门为对话场景进行了优化。 这是一个系列的文章,会分别从LLAMA2的预训练,微调,安全性等方面进行讲解。 1.数据来源 数据…

SDRAM控制器的设计与验证(野火学习笔记)

SDRAM发展至今已历经五代,具有单位存储量大、高数据带宽、读写速度快、价格相对便宜等优点。同时,作为内存条中不可缺少的有一部分,SDRAM在计算机领域也占有一席之地。 (SDRAM的内容以及操作时序比较复杂,本文已经尽可…

域7:安全运营 第17章 事件的预防和响应

第七域包括 16、17、18、19 章。 事件的预防和响应是安全运营管理的核心环节,对于组织有效识别、评估、控制和减轻网络安全威胁至关重要。这一过程是循环往复的,要求组织不断总结经验,优化策略,提升整体防护能力。通过持续的监测、…

计算机毕业设计Python+大模型知识图谱中华古诗词可视化 古诗词智能问答系统 古诗词数据分析 古诗词情感分析 PyTorch Tensorflow LSTM

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 开发技术: 前端…

Web前端-JavaScript书写位置

一、JavaScript介绍 1.JavaScript 是什么? 是一种运行在客户端(浏览器)的编程语言,实现人机交互效果。 2.作用 (1)网页特效(监听用户的一些行为让网页作出对应的反馈) (2)表单验证(针对表单数据的合法性进行判断…

C语言——头文件的使用

目录 前言头文件怎么包含 前言 这个专栏会专门讲一些C语言的知识,后续会慢慢更新,欢迎关注 C语言专栏 头文件怎么包含 在使用头文件的过程中,我们经常会遇到重定义、重复包含等问题,那么怎么编写头文件和使用头文件才能解决这些…

通过 Twitter Token 实现授权与操作

通过 Twitter Token 实现授权与操作 一、Twitter API 概览 1.1 Twitter API 简介 Twitter API 是 Twitter 公司提供的一种编程接口,它允许开发者访问 Twitter 的海量数据,包括用户信息、推文内容、关系网络等。通过这些接口,开发者可以创建应用程序,实现自动化的社交媒体…

大语言模型训练

大语言模型训练 1.两大问题2.并行训练2.1数据并行2.2模型并行2.3张量并行2.4混合并行 3.权重计算3.1浮点数3.2混合精度训练3.3deepspeed(微软)3.3.1 ZeRO3.3.2ZeRO-offload 3.3总结 4.PEFT4.1Prompt TuningPrefix-tuning4.2P-tuning & P-tuning v2 5…

sentinel dashboard分布式改造落地设计实现解释(二)-分布式discovery组件

discovery discovery负责维护app/机器资料库,transport健康检测, transport上下线处理。discovery关键是分布式存储,后续研究一下raft,其复制,状态机,快照技术,但个人觉得,discover…