技术博客总结

技术博客总结

技术概述

Gin 是一个用 Go (Golang) 编写的 web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架,由于 httprouter,速度提高了近 40 倍。 如果你是性能和高效的追求者,你会爱上 Gin.

技术详述

  1. 准备工作

    添加依赖

    module my-mod
    
    go 1.14
    
    require (
    	github.com/gin-gonic/gin v1.7.1
    )
    
  2. 支持中间件

    简介:传入的 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()
    	}
    }
    
  3. 支持路由组

    简介:更好地组织路由。不同的 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
    }
    
    
  4. 支持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(&param); err != nil {
    		code = e.InvalidParams
    	} else {
    		model.UpdateClientPolitical(clientId, param.Political)
    	}
    
    	util.JSON(c, code, data)
    }
    
  5. 流程图
    技术博客总结

问题和解决过程

总结

第一次真正接触go语言和gin框架,感觉用起来还是很舒服很简单的,没想象中的那样困难,可能这就是语言和框架的设计艺术吧,使得底层原理对程序员透明化,而且这个语言和框架都很热门,遇到问题都很容易能通过查找资料解决。

参考

https://github.com/gin-gonic/gin

上一篇:gin框架 路由拆分与注册


下一篇:gin加vue使用nginx代理部署服务器