6-Gin 路由详解 --[Gin 框架入门精讲与实战案例]

Gin 是一个用 Go 语言编写的 HTTP Web 框架,以其高性能和简洁的 API 而闻名。它提供了一套强大的路由功能,使得开发者可以轻松地定义 URL 路由规则,并将这些规则映射到具体的处理函数(handler)。以下是关于 Gin 路由的详细解析:

1. 基本路由

Gin 允许你非常简单地定义基本的路由。你可以为不同的 HTTP 方法(如 GET、POST 等)指定路径和相应的处理器。

package mainimport ("github.com/gin-gonic/gin"
)// main 是程序的入口点
func main() {// 创建一个默认的 Gin 路由器router := gin.Default()// 定义根路径的 GET 请求处理函数router.GET("/", func(c *gin.Context) {// 返回 HTTP 200 状态码和 "Hello World!" 字符串响应c.String(200, "Hello World!")})// 定义 /submit 路径的 POST 请求处理函数router.POST("/submit", func(c *gin.Context) {// 返回 HTTP 200 状态码和一个 JSON 响应,包含消息 "Form submitted"c.JSON(200, gin.H{"message": "Form submitted",})})// 监听并在 0.0.0.0:8080 上启动服务router.Run(":8080")
}

在这里插入图片描述

2. 参数化路由

Gin 支持在路径中使用参数,这允许你创建动态路由。

package mainimport ("github.com/gin-gonic/gin"
)// main 是程序的入口点
func main() {// 创建一个默认的 Gin 路由器router := gin.Default()// 路由处理函数,用于响应带有具体用户ID的GET请求router.GET("/user/:id", func(c *gin.Context) {// 提取URL参数中的id值id := c.Param("id")// 返回用户ID信息c.String(200, "User ID is %s", id)})// 使用通配符 :name 匹配任意字符直到斜杠或结尾router.GET("/file/*filepath", func(c *gin.Context) {// 提取URL参数中的filepath值filepath := c.Param("filepath")// 返回文件路径信息c.String(200, "File path is %s", filepath)})// 监听并在 0.0.0.0:8080 上启动服务router.Run(":8080")
}

在这里插入图片描述

3. 查询参数

除了路径参数外,还可以通过 c.Query() 方法获取 URL 查询参数。

package mainimport ("github.com/gin-gonic/gin"
)// main 是程序的入口点
func main() {// 创建一个默认的 Gin 路由器router := gin.Default()// RouterGET为/search路径定义了一个处理函数,用于处理GET请求。// 该函数接收一个*gin.Context参数c,代表HTTP请求的上下文。// 参数c包含了请求、响应、HTTP头等信息,并且是处理请求和写入响应的核心对象。router.GET("/search", func(c *gin.Context) {// 使用c.Query方法从请求的查询字符串中获取名为'q'的值。// 如果'q'不存在,该方法返回一个空字符串。query := c.Query("q")// 使用c.String方法向HTTP响应中写入一个格式化后的字符串。// 该方法的参数包括HTTP状态码(此处为200,表示OK)和格式化字符串以及相应的参数。c.String(200, "Search query is %s", query)})// 监听并在 0.0.0.0:8080 上启动服务router.Run(":8080")
}

在这里插入图片描述

4. 表单数据

对于 POST 请求,可以使用 c.PostForm() 来获取表单字段。

package mainimport ("github.com/gin-gonic/gin"
)// main 是程序的入口点
func main() {// 创建一个默认的 Gin 路由器router := gin.Default()// 处理 POST 请求的路由router.POST("/form", func(c *gin.Context) {// 获取表单数据中的 name 字段name := c.PostForm("name")// 获取表单数据中的 age 字段age := c.PostForm("age")// 返回处理结果c.String(200, "Name: %s, Age: %s", name, age)})// 监听并在 0.0.0.0:8080 上启动服务router.Run(":8080")
}

在这里插入图片描述

5. 分组路由

为了更好地组织代码,可以使用 Group 创建一组具有相同前缀的路由。

package mainimport ("github.com/gin-gonic/gin"
)func main() {// 创建默认的路由引擎router := gin.Default()// 创建一个名为 "api" 的分组路由,所有以 /api 开头的 URL 都会进入这个分组api := router.Group("/api"){// 为整个分组添加一个简单的日志中间件api.Use(func(c *gin.Context) {fmt.Println("API Middleware Called")c.Next()})// 定义一个 GET 路由,用于获取所有用户api.GET("/users", getUsers)// 定义一个带参数的 GET 路由,用于根据 ID 获取单个用户api.GET("/users/:id", getUserByID)}// 启动 HTTP 服务,默认监听端口是 8080router.Run(":8080")
}// 模拟获取所有用户的处理器
func getUsers(c *gin.Context) {users := []string{"Alice", "Bob", "Charlie"}c.JSON(200, users)
}// 模拟根据 ID 获取单个用户的处理器
func getUserByID(c *gin.Context) {id := c.Param("id")user := "User with ID " + idc.JSON(200, gin.H{"user": user})
}

在这里插入图片描述

6. 中间件

Gin 提供了中间件机制,可以在请求到达最终处理器之前对请求进行预处理。

package mainimport ("fmt""time""github.com/gin-gonic/gin"
)func main() {// 创建默认的路由引擎router := gin.Default()// 定义一个全局中间件,用于记录所有请求的时间戳和耗时router.Use(Logger())// 定义一个 GET 路由,访问根路径时返回 "Hello World!"router.GET("/", func(c *gin.Context) {c.String(200, "Hello World!")})// 定义另一个 GET 路由,模拟处理较慢的请求router.GET("/slow", func(c *gin.Context) {time.Sleep(2 * time.Second)c.String(200, "This was a slow request.")})// 启动 HTTP 服务,默认监听端口是 8080router.Run(":8080")
}// Logger 是一个自定义的中间件函数
func Logger() gin.HandlerFunc {return func(c *gin.Context) {// 记录开始时间start := time.Now()path := c.Request.URL.Pathraw := c.Request.URL.RawQuery// 处理请求前的操作fmt.Printf("Started %s %s\n", c.Request.Method, path)// 将请求传递给下一个中间件或处理器c.Next()// 处理请求后的操作end := time.Since(start)fmt.Printf("Completed %s in %v\n", path, end)// 如果有查询参数,则打印出来if raw != "" {fmt.Printf("With query: %s\n", raw)}}
}

在这里插入图片描述

7. 静态文件服务

在 Gin 框架中提供静态文件服务(如图片、CSS 文件、JavaScript 文件等)非常简单。你可以使用 router.Static() 方法来指定一个 URL 路径前缀和本地文件系统的目录,从而将静态文件暴露给客户端。

下面是一个简单的 Gin 应用程序示例,它展示了如何设置静态文件服务。

示例:Gin 静态文件服务简单示例

创建项目结构

首先,创建如下所示的项目结构:

my-gin-app/
├── main.go
└── static/├── css/│   └── style.css├── js/│   └── script.js└── images/└── logo.png

在这个例子中,static 文件夹包含了 CSS、JavaScript 和图片文件。

创建 main.go 文件

接下来,在 main.go 文件中编写代码来配置 Gin 以提供静态文件服务。

package mainimport ("github.com/gin-gonic/gin"
)func main() {// 创建默认的路由引擎router := gin.Default()// 提供静态文件服务// 这里的第一个参数是 URL 路径前缀,第二个参数是本地文件系统中的目录路径。// 访问 http://localhost:8080/static/css/style.css 将会返回 ./static/css/style.css 文件router.Static("/static", "./static")// 定义一个简单的根路径处理器,用于展示如何链接到静态资源router.GET("/", func(c *gin.Context) {c.HTML(200, "index.tmpl", nil)})// 加载 HTML 模板router.LoadHTMLGlob("templates/*")// 启动 HTTP 服务,默认监听端口是 8080router.Run(":8080")
}
创建 HTML 模板

为了展示如何链接到静态资源,我们还需要创建一个简单的 HTML 模板。在项目的根目录下创建一个名为 templates 的文件夹,并在里面添加一个名为 index.tmpl 的文件:

<!-- templates/index.tmpl -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Gin Static Files Example</title><!-- 链接到静态 CSS 文件 --><link rel="stylesheet" href="/static/css/style.css">
</head>
<body><h1>Welcome to the Gin Static Files Example!</h1><p>This page uses static files served by Gin.</p><!-- 显示静态图片 --><img src="/static/images/logo.png" alt="Logo"><!-- 包含静态 JavaScript 文件 --><script src="/static/js/script.js"></script>
</body>
</html>
添加静态资源

确保你的 static 文件夹中有以下内容:

  • static/css/style.css:包含一些基本的样式规则。

    /* static/css/style.css */
    body {font-family: Arial, sans-serif;text-align: center;margin-top: 50px;
    }
    h1 {color: #333;
    }
    
  • static/js/script.js:包含一段简单的 JavaScript 代码。

    // static/js/script.js
    console.log('Static JavaScript file loaded.');
    
  • static/images/logo.png:放置一张你想要显示的图片。

测试你的应用

保存所有文件后,在终端中运行以下命令启动应用程序:

go run main.go

然后你可以使用浏览器访问 http://localhost:8080/ 来查看页面。你应该能够看到样式化的 HTML 页面,并且控制台中会有来自 JavaScript 文件的日志信息。此外,页面上应该正确显示了 logo.png 图片。

总结

通过上述步骤,我们创建了一个简单的 Gin 应用程序,它可以提供静态文件服务。使用 router.Static() 方法可以轻松地将本地文件夹中的静态资源映射到 Web 上的 URL 路径。这对于开发和测试来说非常方便,也可以直接部署到生产环境中。

在这里插入图片描述

8. 错误处理

虽然 Gin 默认提供了简单的错误处理,但你也可以自定义错误页面或全局错误处理逻辑。

package mainimport ("fmt""net/http""github.com/gin-gonic/gin"
)func main() {// 创建默认的路由引擎router := gin.Default()// 定义一个 GET 路由,访问根路径时返回 "Hello World!"router.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "Hello World!")})// 定义一个可能引发错误的 GET 路由router.GET("/error", func(c *gin.Context) {// 模拟一个可能导致 panic 的操作panic("Something went wrong!")})// 自定义 404 页面router.NoRoute(func(c *gin.Context) {c.JSON(http.StatusNotFound, gin.H{"code":    http.StatusNotFound,"message": "Sorry, the page you're looking for doesn't exist.",})})// 使用 recover 中间件来捕获任何导致 panic 的错误,并返回 500 状态码router.Use(func(c *gin.Context) {defer func() {if err := recover(); err != nil {// 如果发生 panic,记录错误信息并返回 500 状态码fmt.Printf("Panic occurred: %v\n", err)c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"code":    http.StatusInternalServerError,"message": "Internal Server Error",})}}()c.Next()})// 启动 HTTP 服务,默认监听端口是 8080router.Run(":8080")
}

在这里插入图片描述

9. 加载模板

如果你的应用程序需要渲染 HTML 页面,Gin 支持加载和渲染模板。

router.LoadHTMLGlob("templates/*")
router.GET("/welcome", func(c *gin.Context) {c.HTML(http.StatusOK, "welcome.tmpl", gin.H{"title": "Main website",})
})

10. CORS 中间件

跨域资源共享 (CORS) 是一个常见的需求,Gin 提供了官方的 CORS 中间件来简化配置。

router.Use(cors.New(cors.Config{AllowOrigins:     []string{"https://foo.com"},AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},AllowHeaders:     []string{"Origin", "Content-Length", "Content-Type"},ExposeHeaders:    []string{"FooBar"},AllowCredentials: true,
}))

总结

Gin 的路由系统设计得非常直观且强大,能够满足大多数 Web 应用的需求。通过上述方法,你可以轻松地构建出高效、可维护的 RESTful API 或完整的 Web 应用。根据你的具体应用场景,选择合适的路由策略和中间件组合,可以使开发过程更加流畅和高效。如果你有更复杂的需求,比如基于正则表达式的路由匹配等,Gin 也提供了足够的灵活性来进行扩展。

下载示例代码

Gin 框架入门精讲与实战案例代码

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

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

相关文章

【数据库初阶】Linux中库的基础操作

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; 数据库初阶 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们&#xff0c;大家好&#xff01;在这篇文章中&#xff0c;我们将深入浅出地为大家讲解 Linux…

【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)11

文章目录 一、算法概念11二、算法原理&#xff08;一&#xff09;感知机&#xff08;二&#xff09;多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、MLP分类任务实…

【LLM】OpenAI 的DAY12汇总和o3介绍

note o3 体现出的编程和数学能力&#xff0c;不仅达到了 AGI 的门槛&#xff0c;甚至摸到了 ASI&#xff08;超级人工智能&#xff09;的边。 Day 1&#xff1a;o1完全版&#xff0c;开场即巅峰 12天发布会的开场即是“炸场级”更新——o1完全版。相比此前的预览版本&#x…

MaixBit k210学习记录

开发背景&#xff1a;Window系统主机&#xff0c;在主机上安装了虚拟机&#xff08;VirtualBoxUbuntu23.04&#xff09; 目标实现&#xff1a;在虚拟机&#xff08;Ubuntu&#xff09;中&#xff0c;实现对Maix bit&#xff08;k210&#xff09;开发板的开发 虚拟机的安装参考…

ExpDemo-JavaFX打造属于你自己的图形化漏洞利用工具

声明&#xff01;本文章所有的工具分享仅仅只是供大家学习交流为主&#xff0c;切勿用于非法用途&#xff0c;如有任何触犯法律的行为&#xff0c;均与本人及团队无关&#xff01;&#xff01;&#xff01; 目录标题 前言编写属于你的图像化漏洞利用工具项目结构编写EXP部署 部…

串口通信标准RS232、RS422、RS485有什么区别和不同

目录 第一个区别&#xff1a;硬件管脚接口定义不同&#xff1a; 第二个区别、工作方式不同 第三个区别、通信方式不同 第四个区别&#xff0c;逻辑特性不同 第五个区别、抗干扰性、传输距离和传输速率也不同 RS-232与RS-485对比 RS-422与RS-485对比 今天给大家分享的是&…

银河麒麟操作系统安装达梦数据库(超详细)

目录 引言1. 前期准备1.1 安装麒麟系统1.2 下载达梦数据库安装包&#xff08;DM8&#xff09;1.3 上传安装包到麒麟系统1.4 挂载安装包&#xff08;iso&#xff09;文件1.5 配置安装用户和组1.6 创建安装路径及修改权限1.7 设置临时安装目录 2. 安装达梦数据库&#xff08;DM8&…

Linux-frp_0.61.1内网穿透的配置和使用

下载frp frp官网 https://gofrp.org/zh-cn/docs/setup/ frp安装包下载地址 https://github.com/fatedier/frp/releases?page1 下载之后在服务器上 解压 tar -zxvf frp_0.61.1_linux_amd64.tar.gztar&#xff1a;一个用于压缩和解压缩的工具。-z&#xff1a;表示使用 gzi…

04.HTTPS的实现原理-HTTPS的混合加密流程

04.HTTPS的实现原理-HTTPS的混合加密流程 简介1. 非对称加密与对称加密2. 非对称加密的工作流程3. 对称加密的工作流程4. HTTPS的加密流程总结 简介 主要讲述了HTTPS的加密流程&#xff0c;包括非对称加密和对称加密两个阶段。首先&#xff0c;客户端向服务器发送请求&#xf…

【从零开始入门unity游戏开发之——C#篇34】C#匿名函数(delegate )和Lambda表达式

文章目录 一、匿名函数&#xff08;delegate &#xff09;1、什么是匿名函数&#xff1f;2、匿名函数的基本语法2.1 语法2.2 **没有参数的匿名函数&#xff1a;**2.3 **有参数的匿名函数&#xff1a;**2.4 **有返回值的匿名函数&#xff1a;** 3、匿名函数的使用示例3.1 作为参…

IDEA开发Java应用的初始化设置

一、插件安装 如下图所示&#xff1a; 1、Alibaba Java Coding Guidelines 2.1.1 阿里开发者规范&#xff0c;可以帮忙本地自动扫描出不符合开发者规范的代码&#xff0c;甚至是代码漏洞提示。 右击项目&#xff0c;选择《编码规约扫描》&#xff0c;可以进行本地代码规范扫…

代码模拟打字机(python)

回车符\r打印稿纸&#xff0c;time.sleep模拟停顿效果&#xff0c;一顿一顿的打字机效果就此呈现。 (笔记模板由python脚本于2024年12月27日 19:34:37创建&#xff0c;本篇笔记适合有基础编程能力的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.…

让 AMD GPU 在大语言模型推理中崭露头角:机遇与挑战

在当今科技飞速发展的时代&#xff0c;大语言模型&#xff08;LLM&#xff09;的兴起彻底改变了人工智能领域的格局。从智能客服到文本生成&#xff0c;从知识问答到代码编写辅助&#xff0c;大语言模型的应用无处不在&#xff0c;深刻影响着我们的生活和工作。然而&#xff0c…

LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读

LLMs之o3&#xff1a;《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 导读&#xff1a;2024年12月&#xff0c;这篇论文提出了一种名为“审慎式对齐 (Deliberative Alignment)”的新方法&#xff0c;旨在提高大型语言模型 (LLM) 的安全性。论…

音视频入门基础:MPEG2-TS专题(24)——FFmpeg源码中,显示TS流每个packet的pts、dts的实现

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…

微信流量主挑战:用户破16!新增文档转换(新纪元3)

朋友们&#xff0c;报告好消息&#xff01;我的小程序用户数量已经涨到16个了&#xff01;没错&#xff0c;真没拉朋友圈亲戚好友来撑场子&#xff0c;全靠实力&#xff08;和一点点运气&#xff09;吸引了16位陌生小伙伴光临&#xff01;这波进步&#xff0c;连我自己都感动了…

顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)

文章目录 前言联系我们mod_cti版本支持安全加强说明 前言 FreeSWITCH暴露在公网最大的风险就是被不法之人盗打 出现盗打的主要原因以下几点&#xff1a; 分机密码太简单或者密码泄露了拨号方案配置不合理sofia配置错误 所以我们给顶顶通呼叫中心中间件添加了安全加强功能&am…

【Halcon】例程讲解:基于形状匹配与OCR的多图像处理(附图像、程序下载链接)

1. 开发需求 在参考图像中定义感兴趣区域&#xff08;ROI&#xff09;&#xff0c;用于形状匹配和文本识别。通过形状匹配找到图像中的目标对象位置。对齐多幅输入图像&#xff0c;使其与参考图像保持一致。在对齐后的图像上进行OCR识别&#xff0c;提取文本和数字信息。以循环…

产品初探Devops!以及AI如何赋能Devops?

DevOps源自Development&#xff08;开发&#xff09;和Operations&#xff08;运维&#xff09;的组合&#xff0c;是一种新的软件工程理念&#xff0c;旨在打破传统软件工程方法中“开发->测试->运维”的割裂模式&#xff0c;强调端到端高效一致的交付流程&#xff0c;实…

python+PyMuPDF库:(一)创建pdf文件及内容读取和写入

目录 文档操作 打开文档 获取文档信息 删除页 复制页 移动页 选择重构合并 保存关闭 页对象操作 内容读取 获取页对象的字体样式 插入文本标签 插入文本内容 字体设置 insert_text添加文本 insert_textbox添加文本 插入图片 获取页面注释、链接、表单字段 …