最近使用 gin 的總結

sai0556發表於2020-07-11

最近有新專案是利用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()
}

大概就這些了,後面有可以分析的再補充。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

收藏前不妨點個贊試試!!!
分享開發知識,歡迎交流。qq交流群:965666112,公眾號:愛好歷史的程式設計師。
點選直達個人部落格