当前位置: 首页 > 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
http://www.lryc.cn/news/239542.html

相关文章:

  • CMakeLists.txt基础指令与cmake-gui生成VS项目的步骤
  • IT应用运维最常用指标
  • Go中各种newreader和newbuffer的使用
  • visual studio 如何建立 C 语言项目
  • app小程序定制开发的优势|企业软件网站建设
  • 物联网AI MicroPython学习之语法 WDT看门狗外设
  • JVM线程的几种状态
  • 基于单片机停车场环境监测系统仿真设计
  • 每日一题:LeetCode-589.N叉树的前序遍历
  • PTA 7-2 简单计算器
  • 9、鸿蒙应用桌面图标外观和国际化
  • oracle rac 19c修改不同网段public ip
  • 【Django-DRF用法】多年积累md笔记,第(4)篇:Django-DRF反序列化详解
  • OpenAI宣布暂停ChatGPT plus用户订阅,解决方案,无需等待立马升级
  • 如何将 Docsify 项目部署到 CentOS 系统的 Nginx 中
  • 小程序存在优惠卷遍历,但是歪了
  • HarmonyOS第一课-对比Kotlin,快速入门TypeScript
  • 【自动驾驶】一些业内自动驾驶专业术语释义
  • 好用的博客评论系统 Valine 使用及避坑指南
  • 【Mysql】[Err] 1293 - Incorrect table definition;
  • SpringBoot——日志及原理
  • 7种SQL的进阶用法
  • Unity--互动组件(Scrollbar)||Unity--互动组件(DropDown )
  • Unity、UE和Godot的优劣对比
  • CMAK Kafka可视化管理工具
  • PHP如何持续监听Redis的消息订阅并推送到前端?
  • php项目从宝塔面板切换转到phpstudy小皮面板
  • 基于Acconeer的A121-60GHz毫米波雷达传感器SDK移植及测距示例(STM32L496为例)
  • flink1.10袋鼠云 迁移 flink1.15原生环境 事项汇总
  • 鸿蒙:Harmony开发基础知识详解