在项目中如何使用gin快速的搭建自己的框架,本节教你使用gin框架,路由、中间件、控制器的使用,以及mod、air等工程化使用 我们先来搭建一个gin项目。
本章内容
- 基于mod构建go项目
- air 代码热加载
- 使用gin框架的路由以及中间件
- 对go api 进行单元测试
首先我们在 $GOPATH
下创建gin
文件夹并 进入目录
cd gin
go mod init gin
生成了go.mod
文件 mod
是go官方提供的包管理工具类似php
的composer
和javascript
的npm
、yarn
。
下面我们来安装gin
框架
go get -u github.com/gin-gonic/gin
如上,安装成功。我们开始编码。创建main.go
入口文件
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
data := map[string]interface{}{
"lang": "GO语言"
}
c.JSON(http.StatusOK, data)
})
router.Run(":8081")
}
我们每次都要执行go run main.go
命令对代码进行重新加载并使它修改生效。太麻烦了,如何热加载代码。 执行以下命令
go get -u github.com/cosmtrek/air
linux或者mos下 应该把alias air=’~/.air’加到.bashrc或.zshrc中。然后项目跟目录执行。
air
浏览器访问127.0.0.1:8081
接下来我们使用路由分组、以及编写api
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
data := map[string]interface{}{
"lang": "GO语言"
}
c.JSON(http.StatusOK, data)
})
api := router.Group("/api")
{
api.GET("/get",apiGet)
api.POST("/post",apiPOST)
}
router.Run(":8081")
}
func apiGet(c *gin.Context){
data := map[string]interface{}{
"title":"这是一个get请求",
}
c.JSON(http.StatusOK,data)
return
}
func apiPOST(c *gin.Context){
data := map[string]interface{}{
"title":"这是一个psot请求",
}
c.JSON(http.StatusOK,data)
return
}
接下来我们对以下api接口进行测试
- http://127.0.0.1:8081/api/get
- http://127.0.0.1:8081/api/post
创建tests文件并安装stretchr/testify
这个第三方测试包
go get github.com/stretchr/testify
创建api_test.go
文件
package tests
import (
"net/http"
"strconv"
"testing"
"github.com/stretchr/testify/assert"
)
func TestHomePage(t *testing.T) {
baseURL := "http://localhost:8081"
// 1. 请求 —— 模拟用户访问浏览器
var tests = []struct {
method string
url string
expected int
}{
{"GET", "/api/get", 200},
{"POST", "/api/post", 200},
}
// 2. 遍历所有测试
for _, test := range tests {
t.Logf("当前请求 URL: %v \n", test.url)
var (
resp *http.Response
err error
)
// 2.1 请求以获取响应
switch {
case test.method == "POST":
data := make(map[string][]string)
resp, err = http.PostForm(baseURL+test.url, data)
default:
resp, err = http.Get(baseURL + test.url)
}
// 2.2 断言
assert.NoError(t, err, "请求 "+test.url+" 时报错")
assert.Equal(t, test.expected, resp.StatusCode, test.url+" 应返回状态码 "+strconv.Itoa(test.expected))
}
}
使用ide执行该测试文件
如上图所示,测试完成✅
给接口增加中间件
...
api := router.Group("/api").Use(Auth())
...
//中间件 没有token则返回500
func Auth() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("token")
if token =="" || len(token) <1 {
c.JSON(http.StatusInternalServerError, map[string]interface{}{
"code":500,
"msg":"token不存在",
})
c.Abort()
return
}
}
}
使用postman进行接口测试
测试成功 中间件添加完成