简介
入门
一个简单实例
-
engine := gin.Default()
函数,返回一个Engine指针,代表整个框架的一个实例。是框架的入口,通过它来定义服务路由信息。本质是对go语言中内置的http server的包装。一般创建Engine都是使用Default()或New(),Default()内部也是调用New()。
调用engine的GET方法:
engine.GET("/hello",funcName)
,两个参数,一个是相对路径,另一个是多个handler。表示针对用户一个请求地址可以指定多个handler来处理用户请求(一般是一个handler处理一个请求)。engine.Run(":端口号")
,指定端口号package main import ( "github.com/gin-gonic/gin" "net/http" ) func main(){ engine := gin.Default() engine.Any("/hello", WebRoot) engine.Run(": 9205") } func WebRoot(ctx *gin.Context){ ctx.JSON(http.StatusOK, gin.H{ //以JSON格式的数据响应用户请求 "code": 200, "message": "hello world", }) }
-
gin.Context
:封装了http.Request、Params等内容的结构体,保存了请求的上下文信息,提供了丰富的方法用于获取当前请求的上下文信息,如果需要获取请求中的 URL 参数、Cookie、Header 都可以通过 Context 对象来获取。这一系列方法本质上是对 http.Request 对象的包装。type Context struct { writermem responseWriter Request *http.Request // 传递接口,使用各个处理函数,更加灵活,降低耦合 Writer ResponseWriter Params Params // 路径当中的参数 handlers HandlersChain // 处理函数的数组 index int8 // 目前在运行着第几个处理函数 engine *Engine Keys map[string]interface{} // 各个中间件添加的key value Errors errorMsgs Accepted []string }
Context 对象提供了很多内置的响应形式,JSON、HTML、Protobuf 、MsgPack、Yaml 等。它会为每一种形式都单独定制一个渲染器。所有的渲染器最终还是需要调用内置的 http.ResponseWriter(Context.Writer) 将响应对象转换成字节流写到套接字中。
//动态路由(参数路由) func main(){ engine := gin.Default() engine.GET("/user/:name", GetUserName) engine.Run(": 9090") } func GetUserName(ctx *gin.Context){ name := ctx.Param("name") ctx.JSON(http.StatusOK, name) }
除了可以使用gin.Context的Param()方法外,还可以使用Params字段获取path中的参数。(path是请求的url中域名之后从/开始的部分,例如http://127.0.0.1:9090/user
,/user就是path)id, err := ctx.Params.Get("id")
id := ctx.Params.ByName("id")
Query()
是指url请求地址中问号后面的查询参数,例如https://juejin.im/search?query=%E6%96%87%E7%AB%A0&type=all
中,query=%E6%96%87%E7%AB%A0&type=all
就是查询参数。gin.Context提供 -
gin.H
:一个map的数据结构。
路由组
gin.RouterGroup
,是对路由树的包装,所有的路由规则最终都由它来进行管理。Engine结构体继承了RouterGroup,所以 Engine 直接具备了 RouterGroup 所有的路由管理功能。- RouterGroup 实现了 IRouter 接口,暴露了一系列路由方法,这些方法最终都是通过调用 Engine.addRoute 方法将请求处理器挂接到路由树中。
- RouterGroup 内部有一个前缀路径属性,它会将所有的子路径都加上这个前缀再放进路由树中。有了这个前缀路径,就可以实现 URL 分组功能。Engine 对象内嵌的 RouterGroup 对象的前缀路径是 /,它表示根路径。RouterGroup 支持分组嵌套,使用 Group 方法就可以让分组下面再挂分组。
【参考文档】轻量级 Web 框架 Gin 结构分析
golang轻量级框架-Gin入门
Gin - 高性能 Golang Web 框架的介绍和使用
Go Web轻量级框架Gin学习系列:数据绑定