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

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

相关文章

路过石岩浪心古村

周末常去的七彩城堡儿童乐园附近经常有老房子&#xff0c;没想到老房子最多的地方还是浪心古村。而且越看越有历史。 见到一座写着《序西书室》的房子&#xff0c;我最开始以为是一个古代的学校。但是查了百度更加不知道什么意思了哈。‌“序西书室”‌是指《文心雕龙》中的一个…

[江科大STM32] 第五集STM32工程模板——笔记

保存&#xff0c;进去选芯片型号&#xff0c;我们是F10C8T6 再添加一些文件&#xff0c;自己看路径 然后去 复习这三文件 打开KEIL add existing那个&#xff0c;添加已经存在的文件 还有5个.c.h文件也要添加进来 回到KEIL 点击旁边的settings 如果你用寄存器开发就建到这里就可…

目标检测,语义分割标注工具--labelimg labelme

1 labelimg labelimg可以用来标注目标检测的数据集&#xff0c; 提供多种格式的输出&#xff0c; 如Pascal Voc, YOLO等。 1.1 安装 pip install labelimg1.2 使用 命令行直接输入labelimg即可打开软件主界面进行操作。 使用非常简单&#xff0c; 不做过细的介绍&#xff0…

沪深300股指期货一点多少钱?

首先&#xff0c;我们得知道什么是沪深300股指期货。简单来说&#xff0c;它就是一种期货合约&#xff0c;这个合约的“价格”是根据沪深300指数的点数来定的。沪深300指数是由上海和深圳两个交易所里300只最大的股票组成的一个指数&#xff0c;代表了整个股市的大体走势。 沪…

kettle经验篇:Pentaho Repository 类型资源库卡顿问题

2024年马上就结束了&#xff0c;终于在结束前解决了困扰许久的一个问题&#xff1a;kettle的Pentaho Repository 资源库异常卡顿。所以在此也梳理、记录下2024年的最后一个大问题。 项目场景 工作中一个重要内容是数据中心项目&#xff0c;也就必不可少的要用到ETL技术&#x…

工具变量笔记

补充知识 简单介绍工具变量 假设 Y i α β D i ϵ i Y_i\alpha\beta D_i\epsilon_i Yi​αβDi​ϵi​, where E ( ϵ i ∣ D i ) 0 E(\epsilon_i\mid D_i)0 E(ϵi​∣Di​)0. 但是通常这个条件不满足。于是假如有这样一个工具变量 Z i Z_i Zi​存在的话&#xff0c;满…

简易CPU设计入门:本系统中的通用寄存器(五)

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff0c;我…

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

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

【WebAR-图像跟踪】在Unity中基于Imagine WebAR实现AR图像识别

写在前面的话 感慨一下&#xff0c; WebXR的发展是真的快&#xff0c;20年的时候&#xff0c;大多都在用AR.js做WebAR。随着WebXR标准发展&#xff0c;现在诸如Threejs、AFrame、Unity等多个平台都支持里WebXR。 本文将介绍在Unity中使用 Image Tracker实现Web端的AR图像识别功…

视频会议是如何实现屏幕标注功能的?

现在主流的视频会议软件都有屏幕标注功能&#xff0c;屏幕标注功能给屏幕分享者讲解分享内容时提供了极大的方便。那我们以傲瑞视频会议&#xff08;OrayMeeting&#xff09;为例&#xff0c;来讲解屏幕标注是如何实现的。 傲瑞会议的PC端&#xff08;Windows、信创Linux、银河…

物料描述的特殊字符

MM03查看某料号&#xff0c;有特殊字符&#xff0c;看上去是# SE16N中并没有显示出来这个特殊字符 DeBug时可以看到#&#xff0c;复制出来也是#&#xff0c;但其实不是 ALV中也看不到这个特殊字符 需要写代码&#xff0c;获取这个编码Unicode 参考&#xff1a;【ABAP系列】SAP…

HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?

在 iPhone 拍摄照片时&#xff0c;默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点&#xff0c;但在某些设备或软件上可能存在兼容性问题。因此&#xff0c;将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂&#xf…

多模态论文笔记——LLaVA

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型&#xff1a;LLaVA。处理包含图像和文本的多模态数据&#xff0c;并生成合理准确的回答。 文章目录 论文模型架构视觉编码器语言模型多模态融…

【源码 导入教程 文档 讲解】基于springboot校园新闻管理系统源码和论文

可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C、python、数据可视化、大数据、文案 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xf…

时序论文34|AdaWaveNet:用于时间序列分析的自适应小波网络

论文标题&#xff1a;AdaWaveNet: Adaptive Wavelet Network for Time Series Analysis 论文链接&#xff1a;https://arxiv.org/abs/2405.11124 论文代码&#xff1a;https://github.com/comp-well-org/AdaWaveNet/ 前言 这篇文章面向非平稳时间序列进行分析与建模&#x…

运行Springboot + Vue 项目

想要源码&#xff0c;请点击的系统获取源码&#xff1a;https://bichuanyuan.online **前言&#xff1a;**很多小白拿到java SpringBoot Vue前后端分离的项目却不知道怎么运行起来&#xff0c;这里博主就带领小白们一起将项目运行起来吧&#xff01; 一、环境准备 java后端…

16、【ubuntu】【gitlab】【补充】服务器断电后,重启服务器,gitlab无法访问

背景 接wiki 【服务器断电后&#xff0c;重启服务器&#xff0c;gitlab无法访问】https://blog.csdn.net/nobigdeal00/article/details/144280761 最近把不小心把服务器重启&#xff0c;每次重启后&#xff0c;都会出现gitlab无法访问 分析 查看系统正在运行的任务 adminpc…

保姆级JavaWeb项目创建、部署、连接数据库(tomcat)

目录 简介&#xff1a; 一、创建项目 二、tomcat部署 1、将tomcat解压在一个自己找得到路径 2、在idea中添加tomacat模板块 3、添加tomcat服务器 ?三、连接数据库 1、创建一个新的数据库 2、为项目添加jdbc驱动包 3、创建jdbc类 简介&#xff1a; 本学期学的javawe…

使用 HTML 和 CSS 实现绚丽的节日烟花效果

文章目录 1. 效果预览2. 核心技术栈3. 核心代码解读3.1 HTML结构3.2 霓虹文字的CSS样式3.2.1 核心样式代码3.2.2 动画效果 3.3 JavaScript 的烟花效果实现3.3.1 烟花上升3.3.2 粒子爆炸 4. 用户交互5. 运行步骤总结 1. 效果预览 打开后输入文本的展示内容 用户点击页面后播放…

读书笔记-《乡下人的悲歌》

前段时间看了一些 J.D. Vance 的采访视频&#xff0c;几乎都是记者带着刁难的问题先手进攻&#xff0c;而 Vance 面带微笑&#xff0c;提及对方的名字&#xff0c;条理清晰地从对方的攻击中切回主题形成后手反制&#xff0c;实在让人看得过瘾。 更不可思议的是&#xff0c;Van…