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

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

GET POST 请求以及参数获取示例

Get 请求:获取 Quary 参数

// 获取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,})
})

测试如下:

9a07791d0622954b01ab845e2850c8d4.png
1696261337707

Get请求:动态路由,获取 Path 参数

// 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),})
})

测试如下:

9b15408a8ef0bf1579cb0627bc04b229.png
1696262492501

Post请求:获取 form 表单数据

为了简单演示,直接使用 apifox 执行 form 表单的请求。

// 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,})
})

测试如下:

ae85ab5ad4ee8df783d1017db7a1c8a3.png
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()})}
})

测试如下:

58b26a92eea4d25df2a038250f0c11cb.png
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()})}
})

测试如下:

474e2c3953895ddea5981ea896692a2c.png
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参数

f23a781e604ce8831120a2843bec1128.png
1696265111439

请求体如下:

<?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: %s\n", reqBody.Name)fmt.Printf("Email: %s\n", reqBody.Email)// 返回成功响应c.JSON(http.StatusOK, gin.H{"message": "JSON body parsed successfully","reqBody": reqBody,})
})
  • 测试请求如下

b124c5cad68c50d3a8c1344eab1a680f.png
1696265562524

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

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

相关文章

[机缘参悟-119] :一个IT人的反思:反者道之动;弱者,道之用 VS 恒者恒强,弱者恒弱的马太效应

目录 前言&#xff1a; 一、道家的核心思想 二、恒者恒强&#xff0c;弱者恒弱的马太效应 三、马太效应与道家思想的统一 3.1 大多数的理解 3.2 个人的理解 四、矛盾的对立统一 前言&#xff1a; 马太效应和强弱互转的道家思想&#xff0c;都反应了自然规律和社会规律&…

SVN 修改版本库地址url路径

一、win11用户 1. win11系统右链菜单比较优秀&#xff0c;如果菜单中选择“TortoiseSVN”找不到“重新定位”&#xff0c;如下图所示&#xff0c;则需要添加右键菜单&#xff1a; 2.添加右键菜单&#xff1a;选择“TortoiseSVN”&#xff0c;点击设置&#xff0c;如下图所示&a…

Vue 项目实战——如何在页面中展示 PDF 文件以及 PDFObject 插件实战

文章目录 &#x1f4cb;前言&#x1f3af;使用 HTML 标签&#x1f9e9; embed 标签&#x1f9e9; object标签&#x1f9e9; iframe标签&#x1f9e9;完整代码 &#x1f3af;使用 PDFObject 插件&#x1f9e9;为什么使用 PDFObject 插件&#xff08;AI翻译&#xff09;&#x1f…

【微服务】SaaS云智慧工地管理平台源码

智慧工地系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地让工程施工智能化 1、内容全面&#xff0c;多维度数…

华为云IoT与OpenHarmony深度协同,加速设备上鸿即上云【云驻共创】

本次专题论坛探讨了华为云IoT与Open Harmony的深度协同、边缘屏蔽硬件差异、实现智慧隧道全方位智能化管理&#xff0c;以及华为云与Open Harmony生态的合作。同时也介绍了华为云物联网卡平台、HTTP2协议以及华为物联网在交通领域的应用。 一&#xff0e;华为云IoT与Open Harm…

数学几百年重大错误:将两异函数误为同一函数

黄小宁 因各实数都可是数轴上点的坐标所以数集A可形象化为数轴上的点集A&#xff0c;从而使x∈R变换为实数yxδ的几何意义可是&#xff1a;一维空间“管道”g内R轴上的质点x∈R(x是点的坐标)运动到新的位置yxδ还在管道g内&#xff08;设各点只作位置改变而没别的改变即变位前…

Vue学习

1。 搭框架 依赖等 创建vue项目 vue create 项目名称 vue create [options] <app-name>使用vite npm init vitelatest <app-name>-- --template vue 目录调整1 apiutilsvenderimages、styles 配置文件 jsconfig.json 配置之后路径可以直接使用 / {"comp…

mysql 查询

-- 多表查询select * from tb_dept,tb_emp; 内来链接 -- 内连接 -- A 查询员工的姓名 &#xff0c; 及所属的部门名称 &#xff08;隐式内连接实现&#xff09;select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.idtb_emp.id;-- 推荐使用select a.name,b.n…

【精选】OpenCV多视角摄像头融合的目标检测系统:全面部署指南&源代码

1.研究背景与意义 随着计算机视觉和图像处理技术的快速发展&#xff0c;人们对于多摄像头拼接行人检测系统的需求日益增加。这种系统可以利用多个摄像头的视角&#xff0c;实时监测和跟踪行人的活动&#xff0c;为公共安全、交通管理、视频监控等领域提供重要的支持和帮助。 …

TS类型全解

使用TypeScript开发的程序更安全&#xff0c;常见的错误都能检查出来。TS能让程序员事半功倍。而原因在于TS的“类型安全”&#xff08;借助类型避免程序做无效的事情&#xff09;。 图 运行程序的过程 但是TS不会直接编译成字节码&#xff0c;而是编译成JavaScript代码。TS编…

【C+进阶之路】第六篇:C++11

文章目录 一、【C】C11&#xff08;1&#xff09;二、【C】C11&#xff08;2&#xff09; 一、【C】C11&#xff08;1&#xff09; 【C】C11&#xff08;1&#xff09; 二、【C】C11&#xff08;2&#xff09; 【C】C11&#xff08;2&#xff09; &#x1f339;&#x1f33…

3.计算机网络

1.重点概念 MSL&#xff08;Maximum segment lifetime&#xff09;&#xff1a;TCP 报⽂最⼤⽣存时间。它是任何 TCP 报⽂在⽹络上存在的 最⻓时间&#xff0c;超过这个时间报⽂将被丢弃。实际应⽤中常⽤的设置是 30 秒&#xff0c;1 分钟和 2 分钟。 TTL&#xff08;Time to …

LeetCode算法心得——打家劫舍(记忆化搜索)

大家好&#xff0c;我是晴天学长&#xff0c;准备开始深入动态规划啦&#xff0c;先从记忆化搜索开始&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃…

RK3568平台开发系列讲解(Linux系统篇)kernel config 配置解析

🚀返回专栏总目录 文章目录 一、图形化界面的操作二、Kconfig 语法简介三、.config 配置文件介绍四、deconfig 配置文件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核可以通过输入“make menuconfig”来打开图形化配置界面,menuconfig 是一套图形化的配…

Javaweb之Axios的详细解析

1.3 Axios 上述原生的Ajax请求的代码编写起来还是比较繁琐的&#xff0c;所以接下来我们学习一门更加简单的发送Ajax请求的技术Axios 。Axios是对原生的AJAX进行封装&#xff0c;简化书写。Axios官网是&#xff1a;https://www.axios-http.cn 1.3.1 Axios的基本使用 Axios的…

map的基础定义及运用

Map 1 使用 1 声明 /*声明map*/map<int, string> myMap {{1, "Apple"}, {2, "Banana"}, {3, "Orange"}};2 插入元素 myMap.insert(make_pair(4, "Graphes"));3 通过访问键查找和访问元素 cout << myMap[2] <<…

[SCTF 2021]rceme

文章目录 前置知识可变参数绕过create_function注入无字母数字RCE动态链接库so绕过disable_functions利用php原生类进行文件读取 解题过程 前置知识 可变参数绕过 PHP 在用户自定义函数中支持可变数量的参数列表。在 PHP 5.6 及以上的版本中&#xff0c;由 … 语法实现&#x…

2023 年爆肝将近 20 万字讲解最新 JavaEE 全栈工程师基础教程(更新中)

1. Java 语言基本概述 Java 是一种广泛使用的编程语言&#xff0c;由 James Gosling 在 Sun Microsystems&#xff08;现在是 Oracle Corporation 的一部分&#xff09;于 1995 年发表。Java 是一种静态类型的、类基础的、并发性的、面向对象的编程语言。Java 广泛应用于企业级…

【Computer Vision Foundation】全球计算机视觉基金会论文网

计算机视觉基金会&#xff08;Computer Vision Foundation&#xff0c;简称CVF&#xff09;是一个致力于推动计算机视觉领域研究和发展的组织。以下是关于计算机视觉基金会的一些基本信息&#xff1a; 成立目的&#xff1a; CVF成立的目的是促进计算机视觉领域的学术研究、技术…

LVS+Keepalived 高可用群集

一、一.Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 • 支持故障自动切换&#xff08;Failover&#xff09; • 支持节点健康状态检查&#xff08;Health Checking&#xff09; • 官方网站&#xff1a;http://www.keepalived.org/ 二、Keepalived工作原理 • …