最近有新專案是利用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,公眾號:愛好歷史的程式設計師。
點選直達個人部落格