Gin框架学习笔记 | 青训营笔记

58 阅读2分钟

「第五届青训营」伴学笔记创作活动的第 9 天

1. 简介

  • GIN是什么:一个 golang 微框架,封装完善,API 全面,容错率高,运行速度快
  • GIN的优点:降低数据封装的难度与时间,提高开发效率,性能良好

2. 安装

  • 获取 go get -u github.com/gin-gonic/gin
  • 导包 import "github.com/gin-gonic/gin"

3. 路由

GIN 框架的路由依赖于 "net/http" 实现
对于 API 参数,可以使用 Param() 来获取 API 参数
对于 URL 参数,可以使用 Query() 来获取 URL 参数
可以使用 group 来对路由进行分组

4. 中间件

GIN 框架中的中间件主要分为以下几种

  • 全局中间件
  • 局部中间件
  • Next()方法

例如在本次大项目中,为了保证安全性,我们往往需要进行token的分发与验证,最常用的鉴权中间件便是 jwt,在本次大项目中,我的路由分发与管理代码如下:

unc InitRouters() *gin.Engine {

   //数据库初始化
   models.InitDB()

   r := gin.Default()
   r.Static("static", "./public")

   BaseGroup := r.Group("/douyin")

   //基础接口
   //视频流接口
   BaseGroup.GET("/feed/", video.QueryFeedListController)
   userGroup := BaseGroup.Group("/user")
   {
      //用户注册
      userGroup.POST("/register/", middleware.Sha1MiddleWare(), user.RegisterController)
      //用户登录
      userGroup.POST("/login/", middleware.Sha1MiddleWare(), user.LoginController)
      //用户信息
      userGroup.GET("/", middleware.JwtMiddleware(), userinfo.QueryUserInfoController)
   }
   publish := BaseGroup.Group("/publish")
   {
      //投稿接口
      publish.POST("/action/", middleware.JwtMiddleware(), video.PublishController)
      //发布列表
      publish.GET("/list/", middleware.CheckToken(), video.QueryPublishListController)
   }

   //互动接口
   favorite := BaseGroup.Group("/favorite")
   {
      //赞操作
      favorite.POST("/action/", middleware.JwtMiddleware(), video.PostFavorController)
      //喜欢列表
      favorite.GET("/list/", middleware.CheckToken(), video.QueryFavoriteListController)
   }
   commentGroup := BaseGroup.Group("/comment")
   {
      //评论操作
      commentGroup.POST("/action/", middleware.JwtMiddleware(), comment.PostCommentController)
      //评论列表
      commentGroup.GET("/list/", middleware.JwtMiddleware(), comment.QueryCommentListController)
   }

   //社交接口
   relation := BaseGroup.Group("/relation")
   {
      //关注操作
      relation.POST("/action/", middleware.JwtMiddleware(), userinfo.PostFollowController)
      //关注列表
      relation.GET("/follow/list/", middleware.CheckToken(), userinfo.QueryFollowsController)
      //粉丝列表
      relation.GET("/follower/list/", middleware.CheckToken(), userinfo.QueryFansController)
      //朋友列表
      relation.GET("/friend/list/", middleware.CheckToken(), userinfo.QueryFriendsController)
   }

   //消息接口
   messageGroup := BaseGroup.Group("/message")
   {
      //发送消息
      messageGroup.POST("/action/", middleware.JwtMiddleware(), message.PostMessageController)
      //消息记录
      messageGroup.GET("/chat/", middleware.JwtMiddleware(), message.QueryMessageListController)
   }

   return r
}

大项目应用

func (q *QueryCommentListFlow) Operation() (*CList, error) {
   if err := q.CheckJson(); err != nil {
      //log.Println("QueryCommentListFlow:checkJSON失败")
      return nil, err
   }
   if err := q.GetData(); err != nil {
      //log.Println("QueryCommentListFlow:getData失败")
      return nil, err
   }
   if err := q.PackData(); err != nil {
      //log.Println("QueryCommentListFlow:PackData失败")
      return nil, err
   }
   return q.commentList, nil
}
func (q *QueryCommentListFlow) CheckJson() error {
   //判断用户是否存在
   if err := models.NewUserInfoDAO().IsUserInfoExist(q.uid); err != nil {
      return err
   }
   //判断视频是否存在
   if !models.NewVideoDao().VideoAlreadyExist(q.vid) {
      return errors.New(errortype.VideoNoExistErr)
   }
   return nil
}

func (q *QueryCommentListFlow) GetData() error {
   if err := models.NewCommentDao().QueryCommentListByVideoId(q.vid, &q.comments); err != nil {
      return err
   }
   if err := FillCommentList(&q.comments); err != nil {
      return errors.New(errortype.VideoHasNoCommentErr)
   }
   return nil
}

func (q *QueryCommentListFlow) PackData() error {
   q.commentList = &CList{Comments: q.comments}
   return nil
}

以我这次所写的查询评论列表的接口为例,为了保证 Controller 层传递来的参数的格式的正确性,我们需要对参数进行相应的校验,及在 CheckJson 层对参数进行合法性校验

在 GetData 中对根据 JSON 解析出的参数进行数据选取和调用数据库操作

在 PackData 层将相应的结果进行封装,传递回Controller 层