我有一个用Go语言编写的API和一个Angular中的Front语言。
当我ping通该网址时: https://myDomain/v1/users/sign/up Angular正在尝试发出 OPTIONS 请求。
我看到一些必须在API中设置cors的主题,这就是我所做的:
在我的main.go
文件中:
servMuxApi := http.NewServeMux()
user.SetUserRoute(servMuxApi)
c := cors.SetupCors()
handler := c.Handler(servMuxApi)
if err := http.ListenAndServe(servPort, handler); err != nil {
log.Fatal(err)
}
在SetUserRoute
函数中,我只有一个HandleFunc
:
router.HandleFunc("/v1/users/sign/up", SignUpUser)
SetupCors
函数:
func SetupCors() *cors.Cors {
return cors.New(cors.Options{
AllowedOrigins: []string{"http://localhost:8081*", "chrome-extension://coohjcphdfgbiolnekdpbcijmhambjff"},
AllowedMethods: []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete, http.MethodOptions},
AllowCredentials: true,
OptionsPassthrough: true,
})
}
}
NB:您看到的chrome扩展程序是我在Chrome上使用的Postman扩展程序。
使用所有这些设置后,当我尝试使用Angular front Sign Up表单时,Google Chrome控制台上仍然出现错误:
选项https://myDomain/v1/users/sign/up 503
从原点“ https://myDomain/v1/users/sign/up”到“ http://localhost:8081”的XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:否“访问控制” -Allow-Origin'标头出现在请求的资源上。
答案 0 :(得分:1)
我终于明白了这个问题。 我使用 CloudFlare (https://www.cloudflare.com)在服务器上设置一些安全性。 但是在CloudFlare上,“处于攻击模式” 变量被设置为“ ON” ->禁止对我的API的每个请求。 将其设置为关闭后,每个请求都会生效。因此,问题并非出自我的API或Front。 我的API设置得很好...
如果您使用反向代理服务器或某些防火墙,请非常小心您的配置,因为我们有很多冲突。
非常感谢 @Or Yaacov 和 @ mh-cbon 为我提供帮助。 希望这个答案能帮助到别人。
答案 1 :(得分:0)
请添加以下允许的标头: (将通配符“ *”替换为您的应用数据标题)
AllowedHeaders: []string{"Content-Type", "Origin", "Accept", "*"},
与Angular兼容的完整示例(我在以下内容中使用了大猩猩/多核):
//Start starting the http server
func Start() {
router := NewRouter()
headersOk := handlers.AllowedHeaders([]string{"Content-Type", "Origin", "Accept", "*"})
originsOk := handlers.AllowedOrigins([]string{"*"})
methodsOk := handlers.AllowedMethods([]string{"POST", "GET", "DELETE", "OPTIONS"})
http.Handle("/api/", handlers.CORS(headersOk, originsOk, methodsOk)(http.StripPrefix("/api", router)))
panic(http.ListenAndServe(":"+utils.Config.ServerPort, nil))
}