这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
先跑起来再说
去年寒假就听闻gin的大名了,前几天初步了解了一下,今天就记录一下当做复习吧。
go get -u github.com/gin-gonic/gin 然后import导入即可。
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default() // 返回一个默认的Engin
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"hello":"world",
})
})
r.Run(":8080")
}
r := gin.Default() 使用默认的的Engin,向其中注册/路由,跑在8080端口。
type H map[string]interface{} gin已经提前帮我们声明好了一个map,方便我们使用。
啪的一下,很快呀,看到这,我已经上手了。写Node的经验告诉我,下一步就是,写中间件,分组,挂载,写处理函数。
一模一样呀。先往后看。
参数
r.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
c.String(200, "The user id is %s", id)
})
很强大,/users/身份也能匹配上。/users/上的获取的id就会为空。*号参数,不建议使用,当做没看到。
实现的原理也和Express差不多,都是在一个request对象里获取的,只不过在go里,request对象在Context中。
查询参数前,会先从调用c.getQueryCache() ,缓存所有的键值对,提高性能,下次再取别的键就会很快。
还有QueryArray和QueryMap,会自动从查询参数中转换成数组或map。
下面是查询参数方法的列表,对于表单和查询参数都封装地很一致。API非常友好。
| 查询参数 | Form表单 | 说明 |
|---|---|---|
| Query | PostForm | 获取key对应的值,不存在为空字符串 |
| GetQuery | GetPostForm | 多返回一个key是否存在的结果 |
| QueryArray | PostFormArray | 获取key对应的数组,不存在返回一个空数组 |
| GetQueryArray | GetPostFormArray | 多返回一个key是否存在的结果 |
| QueryMap | PostFormMap | 获取key对应的map,不存在返回空map |
| GetQueryMap | GetPostFormMap | 多返回一个key是否存在的结果 |
| DefaultQuery | DefaultPostForm | key不存在的话,可以指定返回的默认值 |
路由分组
func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) RouterGroup
可以看到Group返回的还是一个RouterGroup,所以嵌套下来能形成一个个的分组,类似于树的结构。
第一个参数是相对路径,第二个参数是处理函数。
v1Group := r.Group("/v1")
{
v1Group.GET("/users", func(c *gin.Context) {
c.String(200, "/v1/users")
})
v1Group.GET("/products", func(c *gin.Context) {
c.String(200, "/v1/products")
})
}
自定义中间件
这就是一种洋葱圈模型,也可以理解为Spring的那种AOP,不过AOP是站在对象执行方法的角度,这里是站在处理路由的角度。我们就可以很轻易的实现一个v1请求的日志了
v1 := r.Group("api/v1", func(context *gin.Context) {
fmt.Println("请求v1")
})
{
user := v1.Group("/user")
.....
}
实现鉴权也很简单,直接插入一个鉴权中间件,检查token,选择c.Abort()或者c.Next()放行