go项目中如何集成Gin

465 阅读2分钟

最近在学习使用Go搭建web后端框架。项目中需要集成路由,这里记录下我在集成Gin框架的全过程。

初始化项目

mkdir project
cd project 
go mod init project
touch main.go

下载Gin

go get github.com/gin-gonic/gin

main.go 主函数中,首先开始复制下Gin官方示例的代码

package main

import "github.com/gin-gonic/gin"

func main() {
        r := gin.Default()
        r.GET("/ping", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "pong",
                })
        })
        r.Run()
}

运行代码之后,通过curl命令来简单测试一下

curl http://localhost:8080/ping
# 可以得到如下结果,说明当前接口是可以掉通的
#{"message":"pong"}# 

到这里已经完成了最简单的发送请求的功能。接下来我们对代码进行一些封装

封装 SetupRouter函数

一般来讲,我们不会将太多的代码放到main函数中直接使用,而是封装一些方法,然后再在main 函数中去调用。我这里会将 SetupRouter 函数封装到 bootStrap 文件夹里面。bootstrap文件夹主要放一些需要初始化的方法,例如 初始化路由,数据库,Redis等等。

mkdir bootstrap
touch bootstrap/route.go
// bootstrap/route.go
package bootstrap

import "github.com/gin-gonic/gin"

func SetupRoute(r *gin.Engine) {
        //使用中间件
        r.Use(
                gin.Logger(),
                gin.Recovery(),
        )
        r.GET("/ping", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "pong",
                })
        })
}
//main.go 修改成如下代码
package main

import (
        "project/bootstrap"
        "github.com/gin-gonic/gin"
)

func main() {
        r := gin.New() // 没有使用defaul,是因为这里拆开之后,在setup里面可以自定义配置一些gin的中间件
        bootstrap.SetupRoute(r)
        r.Run()
}

接下来修改route.go 里面的代码

// route.go
package bootstrap

import (
        "strings"

        "github.com/gin-gonic/gin"
)

func SetupRoute(r *gin.Engine) {
        registerMiddleware(r)
        //这里添加业务路由
        registerNotFoundRoute(r)
}
//用于注册中间件
func registerMiddleware(r *gin.Engine) {
        r.Use(
                gin.Logger(),
                gin.Recovery(),
        )
}
//配置404路由
func registerNotFoundRoute(r *gin.Engine) {
        r.NoRoute(func(c *gin.Context) {
                accept := c.Request.Header.Get("Accept")
                if strings.Contains(accept, "text/html") {
                        c.String(404, "404 page not found")
                } else {
                        c.JSON(404, gin.H{
                                "code":    404,
                                "message": "404 page not found",
                        })
                }
        })
}

registerMiddleware 函数里面,可以注册其他的中间件,registerNotFoundRoute 配置404路由。剩下的业务路由,我们统一的放在routes文件夹下面。

mkdir routes
touch routes/api.go
//routes/api.go
package routes

import "github.com/gin-gonic/gin"

func RegisterApiRoute(r *gin.Engine) {
        api := r.Group("/api")
        {
                api.GET("/ping", func(c *gin.Context) {
                        c.JSON(200, gin.H{
                                "message": "pong",
                        })
                })
        }
}

SetupRouter函数里面调用

//bootstrap/route.go
package bootstrap

import (
        "project/routes"
        "strings"

        "github.com/gin-gonic/gin"
)

func SetupRoute(r *gin.Engine) {
        registerMiddleware(r)
        routes.RegisterApiRoute(r) //这里注册业务路由
        registerNotFoundRoute(r)
}

至此已完成最基础的封装。所有的业务路由都在 routes 文件夹中,路由的基建都在bootstrap 里面的 route.go 实现。