GIN使用记录 | 青训营笔记

83 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

本文简要记录一下抖音极简版项目中gin的使用

gin框架是go语言用于net/http服务的轻量级框架,可以用于路由设计、中间件等功能模块,其中go-gin的核心上下文context是gin框架的特色所在,通过上下文实现参数的简单传递和运用

路由

本系统的服务路由设置在router包中的router.go中,在向此路由发送POST/GET请求等时首先调用中间件,然后调用服务handler,此时url中所带的上下文以及参数通过gin context传递给此服务过程中的每个模块

调用路由:

//用户信息
baseGroup.GET("/user/", middleware.JWTMiddleWare(), user_info.UserInfoHandler)
//用户登录
baseGroup.POST("/user/login/", middleware.SHAMiddleWare(),user_login.UserLoginHandler)

中间件:

func JWTMiddleWare() gin.HandlerFunc {
	return func(c *gin.Context) {
		tokenStr := c.Query("token")//通过ginquery函数获取url中的参数
		if tokenStr == "" {
			tokenStr = c.PostForm("token")//使用postfrom获取body中的
                                                      //x-www-form-url
		}
		//用户不存在,阻止执行
		//验证token
		c.Set("user_id", tokenStruck.UserId)//验证成功,设置上下文
		c.Next()//调用后续处理函数
	}
}

跳转至handler:

func UserInfoHandler(c *gin.Context) {
	p := NewProxyUserInfo(c) //得到上文*gin.context
	//得到上层根据token解析的userId
	rawId, rect := c.Get("user_id")
	if !rect {
		p.UserInfoError("解析userId出错")//返回出错信息(JSON)
		return
	}
	err := p.DoQueryUserInfoByUserId(rawId)//调用model层接口查询用户信息
	if err != nil {
		p.UserInfoError(err.Error())//返回用户信息(JSON)
	}
}

上传文件

本项目中要求提供上传视频流文件功能,视频文件存储在服务器本地的static文件夹中

func VideoPublishHandler(c *gin.Context) {
	//准备参数,验证token和user_id
	title := c.PostForm("title")
        //使用MultipartForm方法获取文件
	form, err := c.MultipartForm()
	if err != nil {
		PublishVideoError(c, err.Error())
		return
	}

	//多文件上传
	files := form.File["data"]
	for _, file := range files { //遍历多文件
		suffix := filepath.Ext(file.Filename)    //得到后缀
		if _, cert := videoIndexMap[suffix]; !cert { //判断视频格式是否正确
			PublishVideoError(c, "file format unsupported")
			continue
		}
		name := util.NewFileName(userId) //根据userId得到唯一的文件名
		filename := name + suffix //userId+后缀命名文件
		savePath := filepath.Join("./static", filename)//存入staticfile中
		err = c.SaveUploadedFile(file, savePath)
		if err != nil {
			PublishVideoError(c, err.Error())
			continue
		}
		//调用ffmpeg截取一帧画面作为封面
		
		//数据库持久化
                
                //返回文件上传信息(JSON)
	}
}

总结思考

gin框架和以前用过的python的flask django框架实现的功能基本一致,除了具备轻量级特点之外,其每次请求所保存的gin.context是此框架的一大优点,省去了手动或调用其他函数保存并对上下文进行保护和修改的过程,将上下文信息融入请求过程,方便每次请求的信息穿过框架的各层而被便捷地参考调用。