最近有新项目是利用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 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 } 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" )
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() }
|
大概就这些了,后面有可以分析的再补充。