gpt4 book ai didi

戈兰 + CORS。全局设置不知何故?

转载 作者:IT王子 更新时间:2023-10-29 01:36:33 26 4
gpt4 key购买 nike

我正在尝试这个 Go 小例子 https://github.com/jakecoffman/golang-rest-bootstrap ,到目前为止一切顺利。

我正在尝试添加 CORS 以允许我的前端应用程序访问。

这是我的 Main.go

func main() {

var err error

session, err = r.Connect(r.ConnectOpts{
Address: "localhost:28015",
Database: "demo",
MaxOpen: 40,
})
if err != nil {
log.Fatalln(err.Error())
}

r := mux.NewRouter()
users.Init(r, session)
accounts.Init(r, session)

r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
})

port := "9999" // os.Getenv("PORT")
log.Println("Serving on", ":"+port)
http.ListenAndServe(":"+port, context.ClearHandler(r))
}

它允许根 url 处的 CORS,但由于其他路由是在 Controller 中处理的,所以我似乎无法让 CORS 也在那里工作。

这是 AccountController 的一部分

func NewAccountController(r *mux.Router, s AccountService) *AccountController {
cont := AccountController{s}
r.Handle("/accounts", cont)
r.Handle("/accounts/{id}", cont)

return &cont
}

func (a AccountController) ServeHTTP(w http.ResponseWriter, r *http.Request) {
code := http.StatusMethodNotAllowed
var data interface{}

defer func(c int) {
log.Println(r.URL, "-", r.Method, "-", code, r.RemoteAddr)
}(code)

if r.URL.Path == "/accounts" {
switch r.Method {
case "GET":
code, data = a.List(w, r)
case "POST":
code, data = a.Add(w, r)
default:
return
}
} else {
switch r.Method {
case "GET":
code, data = a.Get(w, r)
case "PUT":
code, data = a.Update(w, r)
case "DELETE":
code, data = a.Delete(w, r)
default:
return
}
}

w.WriteHeader(code)
w.Header().Set("Content-Type", "application/json")

err := json.NewEncoder(w).Encode(data)
if err != nil {
log.Println("Failed to write data: ", err)
code = http.StatusInternalServerError
}
}

任何想法或指示都会很棒。

谢谢,

JB

最佳答案

您可以为此制作一个简单的中间件:

type CORSMiddleware struct {
http.Handler
}

func (cm CORSMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
cm.Handler.ServeHTTP(w, r)
}

然后,你可以像这样使用它:

var h http.Handler = CORSMiddleware{cont}
r.Handle("/accounts", h)
r.Handle("/accounts/{id}", h)

关于戈兰 + CORS。全局设置不知何故?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30325483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com