技术博客总结
技术概述
Gin 是一个用 Go (Golang) 编写的 web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架,由于 httprouter,速度提高了近 40 倍。 如果你是性能和高效的追求者,你会爱上 Gin.
技术详述
-
准备工作
添加依赖
module my-mod go 1.14 require ( github.com/gin-gonic/gin v1.7.1 )
-
支持中间件
简介:传入的 HTTP 请求可以由一系列中间件和最终操作来处理。 例如:Logger,Authorization,GZIP等
使用:在除了登录、刷新token以及获取公共数据之外的API,其它大部分API都需要通过token以验证用户身份(authorization),且验证逻辑都相同,故可以通过中间件中统一处理
func GetTokenWare(c *gin.Context) { token := c.GetHeader("Authorization") if code, clientId, err := util.DecodeToken(token); code != e.Success { if err != nil { log.Println("verify token", err) } util.JSON(c, code, gin.H{}) c.Abort() } else { cid, _ := strconv.Atoi(clientId) c.Set("client_id", cid) c.Next() } }
-
支持路由组
简介:更好地组织路由。不同的 API 版本…… 此外,这些组可以无限制地嵌套而不会降低性能。
使用:通过路由组来集中管理api版本与需要上述认证中间件的路由
func InitRouter() *gin.Engine { gin.SetMode(setting.RunMode) r := gin.Default() apiV1 := r.Group("/api") { apiV1.POST("/client/bind", api.Login) apiV1.GET("/code2token", api.Code2Token) apiV1.GET("/project/list", api.GetProjectList) // authorization路由分组,并对于该分组所有路由使用authorization路由分组中间件 tokenGroup := apiV1.Group("/").Use(middleware.GetTokenWare) { tokenGroup.GET("/client/profile", api.GetClientProfile) tokenGroup.GET("/client/info", api.GetClientInfo) tokenGroup.GET("/client/reward", api.GetClientReward) tokenGroup.POST("/client/update/political", api.UpdateClientPolitical) tokenGroup.GET("/project/detail", api.GetDetail) tokenGroup.POST("/project/sign", api.SignProject) tokenGroup.GET("/client/project/list", api.GetClientOptionInfo) tokenGroup.POST("/project/feedback/img", api.UploadFeedbackImage) tokenGroup.POST("/project/feedback", api.PostFeedback) } } return r }
-
支持JSON验证
简介:Gin 可以解析并验证请求的 JSON,例如检查所需值的存在。
func UpdateClientPolitical(c *gin.Context) { code := e.Success data := gin.H{} clientId := c.MustGet("client_id").(int) param := struct { Political int `json:"political" binding:"required"` // json标签指定了json字段的key,binding标签指定该key必须存在 }{} // 验证json,比如若political key不存在,那么err != nil为真 if err := c.ShouldBindJSON(¶m); err != nil { code = e.InvalidParams } else { model.UpdateClientPolitical(clientId, param.Political) } util.JSON(c, code, data) }
-
流程图
问题和解决过程
无
总结
第一次真正接触go语言和gin框架,感觉用起来还是很舒服很简单的,没想象中的那样困难,可能这就是语言和框架的设计艺术吧,使得底层原理对程序员透明化,而且这个语言和框架都很热门,遇到问题都很容易能通过查找资料解决。
参考
https://github.com/gin-gonic/gin