go 关于配置文件的变化(Viper基本使用)
/*
* @Description:
* @Version: 1.0
* @Autor: solid
* @Date: 2022-08-24 18:37:22
* @LastEditors: solid
* @LastEditTime: 2022-09-19 14:35:48
*/
package main
import (
"fmt"
"net/http"
"strings"
"svm/config"
"github.com/fsnotify/fsnotify"
"github.com/gin-gonic/gin"
"github.com/niemeyer/pretty"
"github.com/spf13/viper"
)
/*
* @Description:
* @Version: 1.0
* @Autor: solid
* @Date: 2022-09-19 14:14:12
* @LastEditors: solid
* @LastEditTime: 2022-09-19 14:27:53
*/
var Config AddressConfig
var GVA_VP *viper.Viper
type AddressConfig struct {
Verify bool `yaml:"verify" json:"verify"` //直接校验
Coin string `yaml:"coin" json:"coin"` //Coin
StartAddress string `yaml:"start_address" json:"start_address"` //开始地址
Csrftoken string `yaml:"x-csrftoken" json:"csrftoken"`
Cookie string `yaml:"cookie" json:"cookie"`
DSN string `yaml:"DSN" json:"DSN"` //数据库
Degree int `yaml:"degree" json:"degree"` //数据库
ServerIp string `yaml:"serverIp" json:"serverIp"`
}
// 初始化Viper配置文件
func InitViper(path string) *viper.Viper {
v := viper.New()
//设置配置文件
v.SetConfigFile(path)
//设置配置文件类型
v.SetConfigType("yaml")
err := v.ReadInConfig()
if err != nil {
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
//监听配置文件的修改
v.WatchConfig()
//当配置文件发送改变
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("config file changed:", e.Name)
if err = v.Unmarshal(&Config); err != nil {
fmt.Println(err)
}
})
if err = v.Unmarshal(&Config); err != nil {
fmt.Println("***************", err)
}
return v
}
type Response struct {
Code int `json:"code"`
Msg string `json:"message"`
Data interface{} `json:"data"`
}
func Hello(ctx *gin.Context) {
// data := fmt.Sprintf("Hello World! %s,", time.Now())
resp := &Response{
Code: 0,
Msg: "success",
Data: fmt.Sprintf("%# v", pretty.Formatter(config.Config)),
}
ctx.JSON(http.StatusOK, resp)
}
func main() {
config.GVA_VP = config.InitViper("config.yaml")
router := gin.Default()
router.Use(Cors())
router.Static("/upload", "./upload/")
//跨域
router.GET("/", Hello)
err := router.Run(Config.ServerIp)
if err != nil {
fmt.Println("Init http server. Error :", err)
}
}
//跨域
func Cors() gin.HandlerFunc {
return func(c *gin.Context) {
method := c.Request.Method // 请求方法
origin := c.Request.Header.Get("Origin") // 请求头部
var headerKeys []string // 声明请求头keys
for k := range c.Request.Header {
headerKeys = append(headerKeys, k)
}
headerStr := strings.Join(headerKeys, ", ")
if headerStr == "" {
headerStr = "access-control-allow-origin, access-control-allow-headers"
}
if origin != "" {
c.Header("Access-Control-Allow-Origin", origin) // 这是允许访问所有域
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE") // 服务器支持的所有跨域请求的方法,为了避免浏览次请求的多次'预检'请求
// header的类型
c.Header("Access-Control-Allow-Headers", "*")
// 允许跨域设置 可以返回其他子段
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar") // 跨域关键设置 让浏览器可以解析
c.Header("Access-Control-Max-Age", "172800") // 缓存请求信息 单位为秒
c.Header("Access-Control-Allow-Credentials", "true") // 跨域请求是否需要带cookie信息 默认设置为true
c.Set("content-type", "application/json") // 设置返回格式是json
}
// 放行所有OPTIONS方法
if method == "OPTIONS" {
c.JSON(http.StatusOK, "Options Request!")
}
// 处理请求
c.Next() // 处理请求
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/61505.html