Golang Gin系列-6:Gin 高级路由及URL参数

在本章中,我们将深入研究使用Gin框架的高级路由和URL参数。我们将介绍如何创建和使用路由组、应用中间件、提取路径参数、处理查询字符串、处理静态文件以及使用HTML模板。

路由分组

为什么要使用路由组

使用路由组有助于保持代码结构整洁有序。当路由被逻辑分组时,它变得更容易管理和扩展应用程序。例如,您可能有一组与用户管理相关的路由,另一组与产品管理相关的路由。

创建和使用路由分组

路由分组能够组织路由并应用通用中间件。这对于对共享公共路径前缀或需要相同中间件的路由进行分组特别有用。
在这里插入图片描述

示例:创建路由分组

在这个例子中,我们为API路由创建分组:

package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()// Group: /apiapi := r.Group("/api"){api.GET("/users", getUsers)api.GET("/products", getProducts)}r.Run() // listen and serve on 0.0.0.0:8080
}func getUsers(c *gin.Context) {c.JSON(200, gin.H{"message": "Fetching all users",})
}func getProducts(c *gin.Context) {c.JSON(200, gin.H{"message": "Fetching all products",})
}

在这个例子中,‘ /api/users ’和‘ /api/products ’被分组在‘ /api ’路径下。

在路由分组中应用中间件

中间件功能对于处理诸如身份验证、日志记录等任务至关重要。通过将中间件应用于路由组,可以确保组内的所有路由都由中间件处理。

示例:应用中间件

在这个例子中,我们将身份验证中间件应用到admin路由组:

package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()// Group: /adminadmin := r.Group("/admin")admin.Use(AuthMiddleware()){admin.GET("/dashboard", adminDashboard)admin.GET("/settings", adminSettings)}r.Run()
}func AuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {// Authentication logicif c.Request.Header.Get("Authorization") != "Bearer token" {c.AbortWithStatus(401)return}c.Next()}
}func adminDashboard(c *gin.Context) {c.JSON(200, gin.H{"message": "Admin Dashboard",})
}func adminSettings(c *gin.Context) {c.JSON(200, gin.H{"message": "Admin Settings",})
}

在这个例子中,‘ AuthMiddleware ’函数检查授权令牌。如果令牌不存在或不正确,请求将以401状态中止。

路径参数和查询字符串

提取路径参数

路径参数允许你在URL中传递数据,使得路由更加动态化。在Gin中的Param方法,你可以使用c 提取这些参数。

示例:提取路径参数

package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/user/:id", getUser)r.Run()
}func getUser(c *gin.Context) {userID := c.Param("id")c.JSON(200, gin.H{"user_id": userID,})
}

在这个例子中,当向‘ /user/123 ’发出请求时,‘ userID ’变量将是‘ 123 ’。

使用查询字符串

查询字符串是在URL中传递数据的另一种方式。它们通常用于过滤、排序和分页。您可以使用c 来检索查询字符串参数。查询的方法。

示例:使用查询字符串

package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/search", search)r.Run()
}func search(c *gin.Context) {query := c.Query("q")c.JSON(200, gin.H{"query": query,})
}

在本例中,当向’ /search?q=golang’,则 ‘query’ 变量将为 'golang '。

处理静态文件和模板

提供静态文件

使用Gin提供静态文件(如图像、CSS和JavaScript文件)非常简单。用“r.static”方法提供静态文件目录。

示例:提供静态文件

package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.Static("/assets", "./assets")r.Run()
}

在这个例子中,任何对‘ /assets ’的请求都将从’./assets’的目录中提供文件。例如,对‘ /assets/style.css ’的请求将从‘ ./assets ’目录中获取‘ style.css ’文件。

使用HTML模板与Gin

Gin支持使用‘ HTML ’方法呈现HTML模板。首先,使用‘ LoadHTMLGlob ’或‘ LoadHTMLFiles ’加载模板。

示例:使用HTML模板

package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.LoadHTMLGlob("templates/*")r.GET("/index", func(c *gin.Context) {c.HTML(200, "index.tmpl", gin.H{"title": "Main website",})})r.Run()
}

templates目录中创建index.tmpl文件:

<!DOCTYPE html>
<html>
<head><title>{{ .title }}</title>
</head>
<body><h1>{{ .title }}</h1>
</body>
</html>

在这个例子中,对‘ /index ’的请求将渲染 ‘index.tmpl’ 模板,并提供title变量为“Main webSite”。

最后总结

通过本文中的示例,你应该能够在Gin应用程序中有效地利用高级路由和URL参数。Gin,愈学习愈快乐, Go!

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

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

相关文章

【2025】拥抱未来 砥砺前行

2024是怎样的一年 2024在历史画卷上是波澜壮阔的一年&#xff0c;人工智能的浪潮来临&#xff0c;涌现出无数国产大模型。 22年11月ChatGPT发布&#xff0c;它的出现如同在平静湖面上投下一颗巨石&#xff0c;激起了层层波澜&#xff0c;短短五天用户数就达到了100万&#xff0…

FreeRTOS系统移植

前言 学习RTOS之前最重要的就是要学会将系统移植到单片机中&#xff0c;这里可以直接使用cubemx生成移植好的工程&#xff0c;也可以下载库来进行自己移植&#xff0c;这里我选择下载库来自己移植&#xff0c;因为这样可以配合Linux开发stm32单片机程序。 一、下载系统代码 …

MySQL 事务及MVCC机制详解

目录 什么是事务 事务的隔离级别 数据库并发的三种场景 读-写 什么是事务 事务就是一组DML语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;这一组DML语句要么全部成功&#xff0c;要么全部失败&#xff0c;是一个整体。MySQL提供一种机制&#xff0c;保证我们…

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码&#xff0c;导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址&#xff1a;icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …

arkime安装

这次试一下新的办法 先下载centOS 7 然后改成阿里云镜像 输入命令备份官方yum源配置文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 下载阿里云源配置&#xff0c;覆盖原文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirr…

/usr/bin/ssh-copy-id: ERROR: no identities found 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于springboot+thymeleaf+Redis仿知乎网站问答项目源码

项目介绍 基于springbootthymeleafRedis仿知乎网站问答项目源码&#xff0c;可以作为毕业设计项目参考学习 按照需要一定动手能力 发文章&#xff0c;发视频&#xff0c;发想法&#xff0c;提问回答&#xff0c;注册登录 开发环境 使用技术&#xff1a;springbootthymeleafRe…

apisix的authz-casbin

目录 1、apisix的auth-casbin官方介绍 2、casbin介绍和使用 2.1基本知识&#xff1a; 2.2使用例子 3、配置插件 4、postman调用 5、auth-casbin的坑 1、apisix的auth-casbin官方介绍 authz-casbin | Apache APISIX -- Cloud-Native API Gateway 2、casbin介绍和使用 c…

自动驾驶之DriveMM: All-in-One Large Multimodal Model for Autonomous Driving

1. 写在前面 工作之后,主要从事于偏工程比较多的内容, 很少有机会读论文了,但2025年,由于之前有些算法的背景, 后面可能会接触一些多模态大模型相关的工作,所以又调头有点往算法的方向偏移, 而算法呢,很重要的一点就是阅读论文。2025年,再拾起论文这块的工作。 今天…

BGP分解实验·9——路由聚合与条件性通告(1)

路由聚合是有效控制缩减BGP路由表的方法之一&#xff0c;路由聚合的前提和IGP一样&#xff0c;需要有路由目标存在BGP表中&#xff0c;与IGP不同的是&#xff0c;BGP路由聚合可以定义按需抑制路由的能力。 实验拓扑如下所示&#xff1a; 现在开始把从R1的R5的基础配置先准备好…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Lin…

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char &#xff08;属于整形家族&#xff09;类型 2. 位段的空间上是按照需要以4个字节&#xff08; 类型 int &#xff09;或者1个字节&#xff08; char &#xff09;的方式来开辟的。 3. 位段涉及…

C++实现矩阵Matrix类 实现基本运算

本系列文章致力于实现“手搓有限元&#xff0c;干翻Ansys的目标”&#xff0c;基本框架为前端显示使用QT实现交互&#xff0c;后端计算采用Visual Studio C。 目录 Matrix类 1、public function 1.1、构造函数与析构函数 1.2、获取矩阵数值 1.3、设置矩阵 1.4、矩阵转置…

HTML<form>标签

例子 具有两个输入字段和一个提交按钮的HTML表单&#xff1a; <form action"/action_page.php" method"get"> <label for"fname">First name:</label> <input type"text" id"fname" name"f…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…

【C++篇】红黑树封装 实现map和set

目录 前言&#xff1a; 一&#xff0c;库中map和set的大致结构 二&#xff0c;模拟实现 2.1&#xff0c;大致框架 2.2&#xff0c;复用红黑树实现insert接口 2.3&#xff0c;迭代器iterator的实现 operator()的实现&#xff1a; operator--()的实现&#xff1a; 对inser…

写作利器:如何用 PicGo + GitHub 图床提高创作效率

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…

RabbitMQ 高级特性

目录 1.消息确认 1.1 消息确认机制 1.2 手动确认方法 1. 2.1肯定确认 1.2.2 否定确认 1.3 SpringBoot 代码示例 1.3.1 配置确认机制 1.3.2 配置队列,交换机,绑定关系 1.3.3 生产者(向 rabbitmq 发送消息) 1.3.4 消费者(消费队列中的信息) 2.持久性 2.1 交换机…

AIGC视频生成模型:Meta的Emu Video模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video&#xff0c;作为Meta发布的第二款视频生成模型&#xff0c;在视频生成领域发挥关键作用。 &#x1f33a;优质专栏回顾&am…