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

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

相关文章:

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

6.Gin 路由详解 - GET POST 请求以及参数获取示例 GET POST 请求以及参数获取示例 Get 请求&#xff1a;获取 Quary 参数 // 获取query参数示例&#xff1a;GET /user?uid20&namejack&page1 r.GET("/user", func(c *gin.Context) {// 获取参数// Query获取参…...

CMakeLists.txt基础指令与cmake-gui生成VS项目的步骤

简介 本博客主要介绍cmake的基本指令&#xff0c;同时&#xff0c;很多使用Visual Studio小白从Gitbub下载项目源码后&#xff0c;看到CMakeLists.txt&#xff0c;不知道如何使用Visual Studio编译源码&#xff1b;针对以上问题&#xff0c;做一下简单操作与解释&#xff0c;方…...

IT应用运维最常用指标

可用性&#xff08;Availability&#xff09; 系统或服务在特定时间范围内可用的百分比。 计算方式&#xff1a;&#xff08;总时间 - 不可用时间&#xff09;/ 总时间 * 100%。 参考值&#xff1a;99.9%。 应用范围&#xff1a;应用系统、网络设备。 故障率&#xff08;Fa…...

Go中各种newreader和newbuffer的使用

一、bytes.NewBuffer和bytes.NewReader func main() {var byteArr []bytebuf : bytes.NewBuffer(byteArr)buf.Write([]byte("今天不错"))fmt.Println(buf.String()) }package mainimport ("bytes""fmt" )func main() {data : []byte("路多…...

visual studio 如何建立 C 语言项目

安装这个 模块。 新建 空项目 创建完成 写demo 点击运行&#xff1a;...

app小程序定制开发的优势|企业软件网站建设

app小程序定制开发的优势|企业软件网站建设 小程序定制开发是目前互联网行业中备受关注的领域之一。随着智能手机的普及和移动互联网的迅猛发展&#xff0c;越来越多的企业和个人开始重视小程序的潜力&#xff0c;并积极寻求定制开发的服务。那么&#xff0c;为什么小程序定制开…...

物联网AI MicroPython学习之语法 WDT看门狗外设

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; WDT 介绍 模块功能: 看门狗WDT&#xff08;WatchDog Timer&#xff09;外设驱动模块 接口说明 WDT - 构建WDT对象 函数原型&#xff1a;WDT(timeout)参数说明&#xff1a; 参数类型必选参数&#xff1f…...

JVM线程的几种状态

1.New 新建的线程&#xff0c;线程还没启动。 2.Runnable 线程正在运行或者等待操作系统中的其他资源&#xff0c;例如线程运行过程中&#xff0c;系统分配资源给其他操作&#xff0c;此时这个线程还是Runnable状态&#xff0c;可以理解为可运行的线程。 3.Blocked 阻塞状…...

基于单片机停车场环境监测系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机停车场环境监测系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的停车场环境监测系统是一种利用单片机技术实现环境监测和数据处理的系统。它可以感知停车场的温湿…...

每日一题:LeetCode-589.N叉树的前序遍历

每日一题系列&#xff08;day 01&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…...

PTA 7-2 简单计算器

7-2 简单计算器 分数 20 全屏浏览题目 作者 张彤彧 单位 浙江大学 模拟简单运算器的工作。假设计算器只能进行加减乘除运算&#xff0c;运算数和结果都是整数&#xff0c;四种运算符的优先级相同&#xff0c;按从左到右的顺序计算。 输入格式: 输入在一行中给出一个四则运…...

9、鸿蒙应用桌面图标外观和国际化

一、项目资源目录 项目下的resoueces目录为资源配置目录&#xff0c;其中base为基础配置&#xff0c;即在任何语言环境下都会加载的资源&#xff0c; color.json&#xff1a;用于配置颜色&#xff0c;如页面的背景和文字的颜色。 string.json&#xff1a;用于设置文字&#…...

oracle rac 19c修改不同网段public ip

客户需求将才搭建的oracle 19.19数据库从192.168.168.0网段调整到192.168.213网段 1.停止两个节点集群 停止之前最好ocrdump一下&#xff0c;防止有问题 crsctl stop crs 2.修改public ip地址和/etc/hosts 3. 启动crs 这时集群可以启动&#xff0c;但是上面的一些资源启动会…...

【Django-DRF用法】多年积累md笔记,第(4)篇:Django-DRF反序列化详解

本文从分析现在流行的前后端分离Web应用模式说起&#xff0c;然后介绍如何设计REST API&#xff0c;通过使用Django来实现一个REST API为例&#xff0c;明确后端开发REST API要做的最核心工作&#xff0c;然后介绍Django REST framework能帮助我们简化开发REST API的工作。 全…...

OpenAI宣布暂停ChatGPT plus用户订阅,解决方案,无需等待立马升级

作为人工智能领域的一项重要革新&#xff0c;ChatGPT Plus的上线引起了众多用户的关注&#xff0c;其背后的OpenAI表现出傲娇的态度&#xff0c;被誉为下一个GTP 4.0。总的来说&#xff0c;ChatGPT Plus的火爆主要有两个原因。首先&#xff0c;其在人工智能对话技术领域的创新&…...

如何将 Docsify 项目部署到 CentOS 系统的 Nginx 中

文章目录 第一步&#xff1a;准备 CentOS 服务器第二步&#xff1a;安装 Node.js 和 Docsify第三步&#xff1a;初始化 Docsify 项目第四步&#xff1a;本地预览 Docsify 项目第五步&#xff1a;配置 Nginx 服务器第六步&#xff1a;重启 Nginx 服务器拓展&#xff1a;使用 HTT…...

小程序存在优惠卷遍历,但是歪了

进入小程序&#xff0c;因为是一个小商城&#xff0c;所以照例先查看收货地址是否存在越权&#xff0c;以及能否未授权访问&#xff0c;但是发现不存在这些问题&#xff0c;所以去查看优惠卷 进入领券中心&#xff0c;点击领取优惠券时抓包 发现数据包&#xff0c;存在敏感参数…...

HarmonyOS第一课-对比Kotlin,快速入门TypeScript

编程语言简介 基础类型 1. 布尔值 TypeScript 和 Kotlin: 两者都有 boolean 类型&#xff0c;用于表示 true 或 false。 ts示例&#xff1a; let isDone:boolean falsekotlin示例&#xff1a; val isDone: Boolean false2. 数字 TypeScript: 有 number 类型&#xff0c…...

【自动驾驶】一些业内自动驾驶专业术语释义

Trajectory 轨迹信息&#xff0c;一般都会发布未来5-10秒的trajactory信息。 Trajectory flicker 轨迹抖动 Nudge 道内避障。在维持车道不变的情况下&#xff0c;横向偏离车道中心以绕开obstacle/agent。 Xlane Nudge 借道避障。借用对向车道或自行车道以绕开obstacle/a…...

好用的博客评论系统 Valine 使用及避坑指南

评论系统&#xff0c;即网站的一个小功能&#xff0c;展示评论内容和用户输入框。开源免费的评论系统可不多&#xff0c;原来很火的"多说"评论系统都关闭了&#xff0c;而Disqus又是国外的访问受限。无意间发现了Valine&#xff0c;挺不错的&#xff0c;分享给大家。…...

【Agent开发】从 Prompt 到 Context,再到 Harness:Agent 开发真正难的不是“会调用大模型”

文章目录 前言一、从 Prompt Engineering 到 Context Engineering&#xff0c;再到 Harness Engineering1.1 Prompt Engineering&#xff1a;最早被大家理解的 AI 技能1.2 Context Engineering1.3 Harness Engineering&#xff1a;从“给信息”走向“搭环境” 二、Harness Engi…...

蓝牙耳机音质差?可能是A2DP编码器没选对!手把手教你切换aptX/LDAC

蓝牙耳机音质差&#xff1f;可能是A2DP编码器没选对&#xff01;手把手教你切换aptX/LDAC 每次用蓝牙耳机听歌总觉得音质发闷&#xff0c;细节丢失严重&#xff1f;这很可能不是耳机硬件的问题&#xff0c;而是设备间默认使用的音频编码器拖了后腿。就像用劣质数据线传输高清视…...

如何快速构建高效QQ机器人:Go-CQHTTP完整实战指南

如何快速构建高效QQ机器人&#xff1a;Go-CQHTTP完整实战指南 【免费下载链接】go-cqhttp cqhttp的golang实现&#xff0c;轻量、原生跨平台. 项目地址: https://gitcode.com/gh_mirrors/go/go-cqhttp 你是否曾为社群管理而烦恼&#xff1f;每天手动审批加群请求、处理违…...

实战指南:在快马平台构建并部署一个harmes agent驱动的智能电商客服系统

实战指南&#xff1a;在快马平台构建并部署一个harmes agent驱动的智能电商客服系统 最近在做一个电商项目&#xff0c;需要给用户提供7x24小时的智能客服支持。传统方案要么成本太高&#xff0c;要么响应速度慢。尝试用harmes agent技术栈结合InsCode(快马)平台的部署能力&am…...

Cursor规则集:用AI代码助手实现团队编码规范自动化

1. 项目概述&#xff1a;当你的代码编辑器开始“思考”如果你是一名开发者&#xff0c;最近可能频繁听到一个词&#xff1a;Cursor。它不再仅仅是一个光标&#xff0c;而是一款正在悄然改变许多程序员工作流的AI代码编辑器。而今天要聊的&#xff0c;不是Cursor本身&#xff0c…...

终极RPG Maker解密指南:3步轻松提取游戏资源

终极RPG Maker解密指南&#xff1a;3步轻松提取游戏资源 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerDe…...

深度解析Jable视频下载项目:基于浏览器扩展与本地协议集成的流媒体下载方案

深度解析Jable视频下载项目&#xff1a;基于浏览器扩展与本地协议集成的流媒体下载方案 【免费下载链接】jable-download 方便下载jable的小工具 项目地址: https://gitcode.com/gh_mirrors/ja/jable-download 在当今Web流媒体服务日益丰富的技术生态中&#xff0c;视频…...

别再花钱买软件了!用FreeCAD 0.21.2的FEM工作台,5步搞定你的第一个有限元分析

零成本实现专业级有限元分析&#xff1a;FreeCAD FEM工作台完全指南 在工程设计和产品开发领域&#xff0c;有限元分析(FEA)是验证结构强度的关键工具&#xff0c;但商业CAE软件动辄数万元的授权费用让个人用户和小团队望而却步。FreeCAD 0.21.2内置的FEM工作台提供了完整的开源…...

Depth-Anything-V2:如何实现5倍性能提升的单目深度估计基础模型?

Depth-Anything-V2&#xff1a;如何实现5倍性能提升的单目深度估计基础模型&#xff1f; 【免费下载链接】Depth-Anything-V2 [NeurIPS 2024] Depth Anything V2. A More Capable Foundation Model for Monocular Depth Estimation 项目地址: https://gitcode.com/gh_mirrors…...

如何用5分钟为.NET应用添加免费金融数据支持

如何用5分钟为.NET应用添加免费金融数据支持 【免费下载链接】YahooFinanceApi A handy Yahoo! Finance api wrapper, based on .NET Standard 2.0 项目地址: https://gitcode.com/gh_mirrors/ya/YahooFinanceApi 你是否曾经想要为自己的.NET应用添加股票行情功能&#…...