手把手教你如何gin入门快速编写api应用之go项目工程化

在项目中如何使用gin快速的搭建自己的框架,本节教你使用gin框架,路由、中间件、控制器的使用,以及mod、air等工程化使用 我们先来搭建一个gin项目。
本章内容
  • 基于mod构建go项目
  • air 代码热加载
  • 使用gin框架的路由以及中间件
  • 对go api 进行单元测试

首先我们在 $GOPATH下创建gin文件夹并 进入目录

cd gin
go mod init gin

在这里插入图片描述
生成了go.mod文件 mod是go官方提供的包管理工具类似phpcomposerjavascriptnpmyarn

下面我们来安装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进行接口测试

在这里插入图片描述
在这里插入图片描述
测试成功 中间件添加完成

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值