最近使用gin的总结

最近有新项目是利用gin开发的,过程中遇到一些问题,总结一下,作为笔记,也希望能帮助到你。

跨域问题

中间件:

func Cors() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 这里可以用*,也可以用你指定的域名
		c.Header("Access-Control-Allow-Origin", "*")
		// 允许头部参数
		c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")
		// 允许的方法
		c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
		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")
 
		method := c.Request.Method
		//放行OPTIONS方法
		if method == "OPTIONS" {
			c.AbortWithStatus(http.StatusOK)
		}
		// 处理请求
		c.Next()
	}
}

然后在路由中加入:

// g : *gin.Engine
g.Use(Cors())

当然也可以在Nginx层配置,可自行查阅,我就不展开了。

使用多个中间件

// g : *gin.Engine
g.Use(Cors())
g.Use(Session())

中间件终止请求

func Auth() gin.HandlerFunc {
    return func(c *gin.Context) {
		uid := c.MustGet("uid").(int)
		if uid == 0 {
			c.Abort()
			controller.SendResponse(c, 401, "未登录", nil)
			// return可忽略
			return
		} else {
			c.Next()
		}
    }
}

session使用

package util

import (
	"github.com/gin-gonic/gin"
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/Redis"
	RedisGo "github.com/gomodule/redigo/Redis"
	"github.com/spf13/viper"
)

// 启动session
func SessionStart(g *gin.Engine, RedisClient *RedisGo.Pool, key ...[]byte)  {
	store, _ := Redis.NewStoreWithPool(RedisClient, []byte(viper.GetString("name")))
	Redis.SetKeyPrefix(store, "session_")
	g.Use(sessions.Sessions(viper.GetString("name"), store))
}

// 使用session
session  := sessions.Default(c)
session.Set("uid", uid)
uid  := session.Get("uid")

上传oss

import (
	"os"
	
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"github.com/spf13/viper"
)
func upload(localPath string, iType int, Name string) (path string) {
	client, err := oss.New(viper.GetString("oss.end_point"), viper.GetString("oss.access_key_id"), viper.GetString("oss.access_key_secret"))
    if err != nil {
		return 
    }

    // 获取存储空间。
    bucket, err := client.Bucket(viper.GetString("oss.bucket"))
    if err != nil {
		return 
    }

    // 上传本地文件。
	ossPath := fmt.Sprintf("%s/%s", "qiling", Name)
    err = bucket.PutObjectFromFile(ossPath, localPath)
    if err != nil {
		return
    }
	
	path = fmt.Sprintf("%s/%s", viper.GetString("oss.hosts"), ossPath)
	os.Remove(localPath)
	return
}

几个实用的方法

import  (
	"fmt"
	"crypto/md5"
	"bytes"
	"regexp"
)

// md5
func  Md5(str string)  string  {
	return fmt.Sprintf("%x", md5.Sum([]byte(str)));
}
// 判断是不是真实手机号码
func IsMobile(mobile string) bool {
    result, _ := regexp.MatchString(`^(1\d{10})$`, mobile)
    if result {
        return true
    } else {
        return false
    }
}

// 合并字符串
func StrCombine(str ...string) string {
	var bt bytes.Buffer
	for _, arg := range str {
		bt.WriteString(arg)
    }
	//获得拼接后的字符串
	return bt.String()
}

大概就这些了,后面有可以分析的再补充。


最近使用gin的总结
https://blog.puresai.com/2020/07/20/261/
作者
puresai
许可协议