这是我参与「第五届青训营 」伴学笔记创作活动的第 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是此框架的一大优点,省去了手动或调用其他函数保存并对上下文进行保护和修改的过程,将上下文信息融入请求过程,方便每次请求的信息穿过框架的各层而被便捷地参考调用。