「第五届青训营」伴学笔记创作活动的第 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 层