Gin框架
Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API,性能要好得多,多亏了httprouter,速度提高了 40 倍。 如果您需要性能和良好的生产力,您一定会喜欢 Gin。
Gin有以下特性。
-
快速
基于 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。
-
可扩展性
新建一个中间件非常简单。
在使用中的要点/遇到的问题
1 基本使用流程
下载并安装Gin
go get -u github.com/gin-gonic/gin
实例代码
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
// GET:请求方式;/hello:请求的路径
// 当客户端以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()
}
首先创建一个默认的路由引擎r,然后再定义RESTful API:GET,POST,DELETE,PUT,分别对应查、增、删、改操作,对于不同的功能,可以在相同的API处规范不同的行为。
在每个RESTful API处,要注意到的第一个问题是,第一个参数的路径必须和客户端请求的路径完全相同才行,postman请求测试的的时候不会出现错误的情况,但当使用前端测试的时候任何的\不同都会导致得不到正确的结果。第二个是第二个参数方法最好放在不同的文件下,便于开发。
最后启动HTTP服务,默认为任何IP都可以访问,端口为8080,需要指定端口需要在Run方法中输入参数":[port]"。
2 静态文件处理
静态文件一般就是我们熟知的html文件等,但在gin中更多地使用的是template模板。
当我们渲染的HTML文件中引用了静态文件时,我们只需要按照以下方式在渲染页面前调用gin.Static方法即可。
由于本次的后端只有API的调用功能,没有渲染前端的需求,就没有对这部分功能的实现。
3 获取前端传入的参数
-
HTTP请求参数:
- 最常见的方式是通过HTTP请求的URL参数传递参数。这些参数通常附加在URL的查询字符串中。例如:
http://example.com/api?param1=value1&m2=value2。 - 在Gin框架中,您可以使用
c.Query()方法来获取URL查询参数的值。
- 最常见的方式是通过HTTP请求的URL参数传递参数。这些参数通常附加在URL的查询字符串中。例如:
-
请求体(Request Body) :
- 参数可以作为HTTP请求的正文部分(通常是JSON或表单数据)发送。这适用于POST、PUT等请求方法。
- 在Gin框架中,您可以使用
c.ShouldBind()或c.ShouldBindJSON()等方法来绑定请求体中的参数到Go结构体中。
-
HTTP请求头(HTTP Headers) :
- 参数可以通过HTTP请求头发送。这通常用于包含身份验证令牌或其他元数据。
- 在Gin框架中,您可以使用
c.GetHeader()方法来获取HTTP请求头的值。
-
Cookie:
- 参数可以存储在HTTP Cookie中,然后由浏览器自动发送到服务器。
- 在Gin框架中,您可以使用
c.GetCookie()方法来获取Cookie的值。
-
路径参数(Path Parameters) :
- 参数可以作为URL的一部分,通常用于RESTful API。例如:
http://example.com/api/resource/{param}。 - 在Gin框架中,您可以使用路由参数来捕获URL路径中的参数,例如:
:param。
- 参数可以作为URL的一部分,通常用于RESTful API。例如:
-
WebSocket消息:
- 对于WebSocket连接,参数可以通过WebSocket消息进行传递。
- 在Gin框架中,您可以使用Gorilla WebSocket库或其他WebSocket库来处理WebSocket连接和消息。
4 路由组
我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由,这只是为了看着清晰,你用不用{}包裹功能上没什么区别。
路由组也是支持嵌套的,通常我们将路由分组用在划分业务逻辑或划分API版本时。
5 中间件
Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。
本次的JWT鉴权、etcd的服务发现就放在了中间件中。
Gin中的中间件必须是一个gin.HandlerFunc类型。
在gin框架中,我们可以为每个路由添加任意数量的中间件。