gin 是 go 语言实现的一个 http web 框架,是一个类 Martini 的 API 且比其执行快 40 倍,gin 支持插件模式加载在项目中需要的功能。在使用 gin 框架构建项目的时候,我们使用操作最多的就是 request、response,gin 为了方便使用设计了巧妙的 context。
下面我们看一个简单的基于 gin 构建的输出 json 数据的接口。
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
fmt.Printf("come on")
r.Run() // listen and serve on 0.0.0.0:8080
}
运行后,通过浏览器访问 127.0.0.1/ping,我们看到输出
{
message: "pong"
}
使用 gin 构建 api 服务就是如此简单。下面我们剖析一下 gin 的重要组成和一个 http 请求到达,解析到输出结果的整个流程。
Engine
从官方给出的例子的第一行代码说开来:r := gin.Default()
通过这一行代码,我们初始换了一个 Engine,Engine 是整个 gin 的核心入口,承担着路由、中间件、参数等设置,是对 http server 的封装。
通过 gin.Default(),初始化一个默认的 engine 实例,它包含了日志和错误自恢复插件。
// Default returns an Engine instance with the Logger and Recovery middleware already attached.
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()
//加载两个插件
engine.Use(Logger(), Recovery())
return engine
}
在 Engine 默认初始化方面中,调用的 New()方法,我看看一下这个方法做了哪些工作:
// New returns a new blank Engine instance without any middleware attached.
// By default the configuration is:
// - RedirectTrailingSlash: true
// - RedirectFixedPath: false
// - HandleMethodNotAllowed: false
// - ForwardedByClientIP: true
// - UseRawPath: false
// - UnescapePathValues: true
func New() *Engine {