Loading... # gin框架 ## 一、gin框架的简介 ### 1、简介 gin 是一个用 Golang编写的 高性能的web 框架, 由于http路由的优化,速度提高了近 40 倍。 Gin的特点就是封装优雅、API友好。 特性: - 快速:基于 Radix 树的路由,小内存占用。没有反射。可预测的 API 性能。 - 支持中间件:传入的 HTTP 请求可以由一系列中间件和最终操作来处理。 例如:Logger,Authorization,GZIP,最终操作 DB。 - Crash 处理:Gin 可以 catch 一个发生在 HTTP 请求中的 panic 并 recover 它。这样,你的服务器将始终可用。例如,你可以向 Sentry 报告这个 panic! - JSON 验证:Gin 可以解析并验证请求的 JSON,例如检查所需值的存在。 - 路由组:更好地组织路由。是否需要授权,不同的 API 版本…… 此外,这些组可以无限制地嵌套而不会降低性能。 - 错误管理:Gin 提供了一种方便的方法来收集 HTTP 请求期间发生的所有错误。最终,中间件可以将它们写入日志文件,数据库并通过网络发送。 - 内置渲染:Gin 为 JSON,XML 和 HTML 渲染提供了易于使用的 API。 - 可扩展性:新建一个中间件非常简单。 ### 2、安装包 > 提示: 依赖Go 1.6 及以上版本 下载安装gin: ``` go get -u github.com/gin-gonic/gin ``` ### 3、gin示例 ``` package main import ( "github.com/gin-gonic/gin" ) func main() { // 创建一个默认的路由引擎 r := gin.Default() // GET请求方式 // 请求路径为/hello // 处理函数会执行后面的匿名函数 r.GET("/hello", func(c *gin.Context) { // c.JSON:返回JSON格式的数据 c.JSON(200, gin.H{ "message": "Hello world!", }) }) // 启动HTTP服务,默认在0.0.0.0:8080启动服务 r.Run() } ``` 执行命令: go run main.go ### 4、项目结构 经典的MVC框架的目录结构的例子如下: ``` |----common # 项目的公共工具或方法 |----tools |----config # 项目的配置文件目录 |----config.ini |----middlewares # 中间件的文件目录 |----log.go # 日志管理 |----jwt.go # 网络安全传输协议 |----casbin.go # 权限管理模块 |----models # 模型目录,负责项目的数据存储部分 |----mysql |----redis |----static # 静态资源目录,可以通过gin框架直接让用户访问(前后端未分离) |----css |----iamges |----js |----logs # 日志文件目录,主要保存项目运行中产生的日志 |----resource # 资源初始化目录 |----mysql.go |----redis.go |----oss.go |----routes # 路由文件目录 |----router.go |----api/controllers# 控制器目录 |----server # 服务配置目录 |----server.go |----service # 项目逻辑目录 |---- |----main.go # 项目入口 ``` ### 5、gin框架运行模式 gin框架分为debug模式和release模式。默认是debug模式,会在控制台打印很多调试的日志,线上需要改成release模式。 代码设置 ``` gin.SetMode("release") gin.SetMode("debug") ``` ## 二、gin路由和控制器 ### 1、路由规则 > 路由的组成 - http请求方法:GET、POST、PUT、DELETE、PATCH、OPTIONS - url路径 - 静态url路径 ``` // exp: /info/center ``` - 带路径参数的url路径 ``` // exp: /info/:id ``` - 带星号(*)模糊匹配参数的路径,必须在号后面指定一个参数名,后面可以通过这个参数获取星号匹配的内容。 ``` // exp: /info/*path ``` - 控制器函数 ``` func HandlerFunc(c *gin.Context) ``` - exp: ``` // 路由实现并绑定控制器 r.POST("/info", saveInfo) //控制器函数实现 func saveInfo(c *gin.Context) { ...忽略实现... } ``` ### 2、分组路由 在api开发过程中,会遇到不同版本或者不同分类的api需求,就可以使用分组来处理这些api。 > exp: ``` func main() { router := gin.Default() // 创建v1组 v1 := router.Group("/v1") { // 在v1这个分组下,注册路由 v1.POST("/login", loginEndpoint) } // 创建v2组 v2 := router.Group("/v2") { // 在v2这个分组下,注册路由 v2.POST("/login", loginEndpoint) } router.Run(":8080") } ``` 上面的url表示为: - /v1/login - /v2/login <div class="hideContent">此处内容需要评论回复后(审核通过)方可阅读。</div> 最后修改:2023 年 03 月 01 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏