go+mysql+redis+vue3简单聊室,第1弹:接口路由搭建和传参


该项目为练手项目,只实现了简单聊天室功能,主要目的为了熟悉golang的协程,go中使用mysql和redis,同时学习vue3和element-plus,项目全程在win下运行。

创建基本路由

我们首先在go的工作目录下下创建一个项目目录,project1。在项目目录中我们建立一个routers目录,用于存放路由相关文件。创建一个route.go文件,如下

import (
	"github.com/gin-gonic/gin"//引入gin框架包,所有非官方包,都需要先安装
)
//创建一个设置header的中间件,设置跨域等请求
func cors() gin.HandlerFunc{
	return func(c *gin.Context){
		method := c.Request.Method
		origin := c.Request.Header.Get("Origin")
		if origin != ""{
			c.Header("Access-Control-Allow-Origin", "http://127.0.0.1:9090")
			c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")
			c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
			c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
			c.Header("Access-Control-Allow-Credentials", "true")
		}
		//放行所有OPTIONS方法
		if method == "OPTIONS" {
			c.AbortWithStatus(http.StatusNoContent)
		}
		// 处理请求
		c.Next()
	}
}


func NewRouter() *gin.Engine{
	//实例化一个gin的路由对象
	r := gin.Default()
	//使用全局中间件
	r.Use(cors())
	//设置路由地址,和执行路由的方法
	//第一个参数为域名后请求的地址
	//第二个参数是一个匿名方法或已定义方法名,方法必须传入*gin.Contex类型的参数
	r.POST("/user/register", func(c *gin.Contex){fmt.Println("这是注册")})
	r.POST("/user/login", func(c *gin.Contex){fmt.Println("这是登录")})
	r.GET("/index", func(c *gin.Contex){fmt.Println("这是首页")})
	return r
}

在项目根目录下创建项目启动文件main.go,如下

package main

import (
	"project1/routes"
)

func main(){
	r := routes.NewRouter()
	r.Run(":8080")
}

在项目根目录下,执行命令行:go run main.go 运行程序
postman中,请求注册方法,地址为:127.0.0.1:8080/user/register
我们看到命令行中打印出了 相关内容,但是postman没有任何内容输出,方法还需要改造,让方法返回数据给response

r.POST("/user/register", func(c *gin.Contex){
	fmt.Println("这是注册")
	//第一参数设置http返回的header头的状态,第二个参数可以是任何类型的值
	c.JOSN(200,gin.H{"code":1,"msg":"请求成功"})
})

再次请求后,postman中返回了我们设置的内容
接下来我们可以在方法内,进行接收数据,注册等操作。但是方法内容比较多时,路由文件比较大,不方便查看。我们可以把方法统一提取到一个文件内,这里只调用方法名即可

接收和验证数据

在项目根目录下,创建api目录。api目录下创建user.go文件,该文件内可以存放用户操作相关的方法,如下

package api

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"github.com/go-playground/validator/v10"
)
//注册的话需要接收传入参数
//gin框架提供了ShouldBind方法,验证并接收传入的参数。但首先要定义好接收参数的结构体,如下
type RegisterRule struct{
	//tag设置对输入字段的验证规则
	//form 表示来接收表单参数,uri接收url参数,json接收json参数,后边是传入的参数名
	//uniquePhone 为自定义验证规则
	Phone string `form:"phone" binding:"required,uniquePhone,min=11,max=11"`
	Password string `form:"password" binding:"required,min=6"`
	Name string `form:"nickname" uri:"nickname" json:"nickname" binding:"required"`
}

//在验证规则定义了一个自定义方法,此处创建该方法,方法名不需要和tag中的名称一致,在注册时会重新命名
//方法必须传入指定类型参数 validator.FieldLevel
func CheckUniquePhone(f validator.FieldLevel) bool{
	// validator是gin框架的默认验证器,可以根据结构体的tag验证字段属性,和获取字段的值
	// 此处获取结构体中传入的字段的值
	if phone,ok := f.Field().Interface().(string);ok {
		var isExist int64
		var userModel User
		mysql := GetMysql()
		defer mysql.Close()
		mysql.Where("phone = ?",phone).First(&userModel).Count(&isExist)
		if isExist >= 1{
			return false
		}
	}else{
		return false
	}
	return true
}

//注册方法
func Register(c *gin.Context){
	//把自定义的校验方法注册到 validator中,ShouldBind执行时会自动调用
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		// uniquePhone为注册的名称,需要和RegisterRule的tag指定的名称一样
		v.RegisterValidation("uniquePhone", CheckUniquePhone)
	}
	//声明一个接收传入参数的结构体变量
	var registerRule RegisterRule
	//执行验证接收
	if err := c.ShouldBind(&registerRule);err == nil {
		c.JSON(200,registerRule)
	}else{
		c.JSON(402,err.Error())
	}
}

执行后,访问127.0.0.1:8080/user/register,传入RegisterRule 中指定参数,查看设置的规则是否生效

创建好方法后,在route.go文件中可以进行引用,如下

import (
	"github.com/gin-gonic/gin"
	"project1/api"
)
func NewRouter() *gin.Engine{
	r := gin.Default()
	r.POST("/user/register", api.register)
	return r
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值