ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

技术博客总结

2021-06-28 12:01:11  阅读:134  来源: 互联网

标签:总结 GET 技术 博客 client api 路由 gin tokenGroup


技术博客总结

技术概述

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

标签:总结,GET,技术,博客,client,api,路由,gin,tokenGroup
来源: https://www.cnblogs.com/nosae/p/14943872.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有