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.rhkb.cn/news/201466.html

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

相关文章

多选按钮关联多个el-checkbox-group

需求&#xff1a; 如图设计稿&#xff0c;全部企业成员下面的数据来源与两个接口&#xff0c;点击全部企业成员需要勾选全部&#xff0c;下面选中全部企业成员要是选中状态&#xff0c;所以需要两个数组变量&#xff0c;两个el-checkbox-group来控制&#xff1b;有人可能会疑问…

你不知道的库:库的种类,作用和加载方式

你不知道的库&#xff1a;库的种类&#xff0c;作用和加载方式 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客…

使用 Redis BitMap 实现签到与查询历史签到以及签到统计功能(SpringBoot环境)

目录 一、前言二、Redis BitMap 位图原理2.1、BitMap 能解决什么2.2、BitMap 存储空间计算2.3、BitMap 存在问题 三、Redis BitMap 操作基本语法和原生实现签到3.1、基本语法3.2、Redis BitMap 实现签到操作指令 四、SpringBoot 使用 Redis BitMap 实现签到与统计功能4.1、代码…

前端CSS实现响应式TimeLine效果(附源码)

文章目录 纯CSS搭建&#xff0c;先上效果图&#xff08;附有源码&#xff09;视图层 index.htmlindex.css 公用样式文件Main.css 主要的样式文件 纯CSS搭建&#xff0c;先上效果图&#xff08;附有源码&#xff09; 本效果为纯CSS搭建&#xff0c;适配移动端和PC端&#xff01…

MySQL 事务的底层原理和 MVCC(二)

7.2. undo 日志 7.2.1. 事务回滚的需求 我们说过事务需要保证原子性&#xff0c;也就是事务中的操作要么全部完成&#xff0c;要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况&#xff0c;比如&#xff1a; 情况一&#xff1a;事务执行过程中可能遇到各种错误&a…

力扣C++学习笔记——C++ 给vector去重

要使用std::set对std::vector进行去重操作&#xff0c;您可以将向量中的元素插入到集合中&#xff0c;因为std::set会自动去除重复元素。然后&#xff0c;您可以将集合中的元素重新存回向量中。以下是一个示例代码&#xff0c;演示如何使用std::set对std::vector进行去重&#…

数据结构学习笔记——多维数组、矩阵与广义表

目录 一、多维数组&#xff08;一&#xff09;数组的定义&#xff08;二&#xff09;二维数组&#xff08;三&#xff09;多维数组的存储&#xff08;四&#xff09;多维数组的下标的相关计算 二、矩阵&#xff08;一&#xff09;特殊矩阵和稀疏矩阵&#xff08;二&#xff09;…

opengl制作天空盒

首先创建顶点数组 unsigned int m_uiVaoBufferID; glGenVertexArrays(1, &m_uiVaoBufferID); 然后创建顶点缓冲区 float skyboxVertices[] {// positions-1.0f, 1.0f, -1.0f,-1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, 1.0f, -1.0f,-1.0f, 1.…

基于晶体结构算法优化概率神经网络PNN的分类预测 - 附代码

基于晶体结构算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于晶体结构算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于晶体结构优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

Android Studio 安装及使用

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

基于一致性算法的微电网分布式控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 本模型主要是基于一致性理论的自适应虚拟阻抗、二次电压补偿以及二次频率补偿&#xff0c;实现功率均分&#xff0c;保证电压以及频率稳定性。 一致性算法 分布式一致性控制主要分为两类&#xff1a;协调同…

深度学习之生成唐诗案例(Pytorch版)

主要思路&#xff1a; 对于唐诗生成来说&#xff0c;我们定义一个"S" 和 "E"作为开始和结束。 示例的唐诗大概有40000多首&#xff0c; 首先数据预处理&#xff0c;将唐诗加载到内存&#xff0c;生成对应的word2idx、idx2word、以及唐诗按顺序的字序列。…

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于材料生成优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

矩阵知识补充

正交矩阵 定义&#xff1a; 正交矩阵是一种满足 A T A E A^{T}AE ATAE的方阵 正交矩阵具有以下几个重要性质&#xff1a; A的逆等于A的转置&#xff0c;即 A − 1 A T A^{-1}A^{T} A−1AT**A的行列式的绝对值等于1&#xff0c;即 ∣ d e t ( A ) ∣ 1 |det(A)|1 ∣det(A)∣…

【开源】基于Vue.js的教学过程管理系统

项目编号&#xff1a; S 054 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S054&#xff0c;文末获取源码。} 项目编号&#xff1a;S054&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…

D. Absolute Beauty - 思维

题面 分析 补题。配上题解的图&#xff0c;理解了很长时间&#xff0c;思维还需要提高。 对于每一对 a i a_i ai​和 b i b_i bi​&#xff0c;可以看作一个线段的左右端点&#xff0c;这是关键的一步&#xff0c;那么他们的绝对值就是线段的长度&#xff0c;对于线段相对位…

Microsoft Visual Studio 2019下载及安装流程记录

第一周任务&#xff1a; 1.笔记本上安装vc2019的环境 2.再把OpenCV安装上 3.根据网上的教程&#xff0c;试着写几个opencv的程序 一、安装Visual Studio 2019社区版 首先先完成安装vc2019的环境&#xff0c; 因为&#xff1a; Microsoft Visual C是用于C编程的工具集合&am…

计算机毕业论文内容参考|基于深度学习的交通标识智能识别系统的设计与维护

文章目录 导文摘要前言绪论1课题背景2国内外现状与趋势3课题内容相关技术与方法介绍系统分析总结与展望导文 基于深度学习的交通标识智能识别系统是一种利用深度学习模型对交通标识进行识别和解析的系统。它可以帮助驾驶员更好地理解交通规则和安全提示,同时也可以提高道路交通…

【tomcat】java.lang.Exception: Socket bind failed: [730048

项目中一些旧工程运行情况处理 问题 1、启动端口占用 2、打印编码乱码 ʮһ&#xfffd;&#xfffd; 13, 2023 9:33:26 &#xfffd;&#xfffd;&#xfffd;&#xfffd; org.apache.coyote.AbstractProtocol init &#xfffd;&#xfffd;&#xfffd;&#xfffd;: Fa…

Active Directory 和域名系统(DNS)的相互关系

什么是域名系统&#xff08;DNS&#xff09; 域名系统&#xff08;DNS&#xff09;&#xff0c;从一般意义上讲是一种将主机名或域名解析为相应IP地址的手段。 在 AD 的中&#xff0c;DNS 服务维护 DNS 域和子域的工作命名空间&#xff0c;这些域和子域主要有助于查找过程&am…