【发布时间】:2018-05-04 04:45:46
【问题描述】:
这是我的第一篇文章。
我刚刚开始学习 Go 和 Angular,我正在尝试将 Angular 应用程序连接到 Go api。我已经写了两个,并且一直在确定问题的根源。我认为这是一个 CORS 问题,但如果我不在我的 Angular http 请求中包含标头代码行,它就可以正常工作。在这一点上,我只是想添加标题。授权码尚未实现。
这两个应用都在本地运行,Go 应用在端口 5000 上,Angular 在 4200 上
Angular http 请求不起作用:
this.http.get<ProjectedBalance>(requestUrl, {headers: new HttpHeaders().set('Authorization', 'my-auth-token')})
.subscribe(data => {
this.projBalance = data.projBalance;
}
有效的 Angular http 请求:
this.http.get<ProjectedBalance>(requestUrl)
.subscribe(data => {
this.projBalance = data.projBalance;
}
我收到此错误:
对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:4200” 使用权。响应的 HTTP 状态代码为 403
我在我的 go 代码中使用了 gorilla/mux 和 gorilla/handlers
router := mux.NewRouter()
router.HandleFunc("/home/{endDate}", GetProjBalance).Methods("GET", "OPTIONS")
headersOk := handlers.AllowedHeaders([]string{"X-Requested-With, Content-Type, Authorization"})
originsOk := handlers.AllowedOrigins([]string{"*"})
methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})
//start server on port
log.Fatal(http.ListenAndServe(":5000", handlers.CORS(originsOk, headersOk, methodsOk)(router)))
Chrome 开发工具的标头
Request URL:http://localhost:5000/home/2020-12-21
Request Method:OPTIONS
Status Code:403 Forbidden
Remote Address:[::1]:5000
Referrer Policy:no-referrer-when-downgrade
Response Headers
view source
Content-Length:0
Content-Type:text/plain; charset=utf-8
Date:Mon, 20 Nov 2017 21:39:43 GMT
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.9,uz;q=0.8
Access-Control-Request-Headers:authorization
Access-Control-Request-Method:GET
Connection:keep-alive
Host:localhost:5000
Origin:http://localhost:4200
【问题讨论】:
-
考虑以问题的形式重新表述您的帖子...
-
我不确定为什么
handlers.CORS不起作用,但如果您不使用 CORS,则需要将您的开发请求代理到端口 5000。在生产中,您将运行在端口 80 上所以没有冲突,但是由于您使用 angular 的开发服务器并在本地运行您的 go 服务器,localhost:4200和localhost:5000是不同的来源。我不确定执行此操作的“角度 5 方式”是什么,但webpack-dev-server在package.json中有一个超简单的proxy字段,您基本上想复制它。 -
您好 gobuckeyes,您能否向我提供您的客户端在其向 API 的请求中发送的标头列表(来自开发工具中的网络选项卡)。如果将所有 3 个 CORS 设置为
{"*"},问题是否仍然存在? -
@Mihailo 我发布了来自开发工具的标题。将所有三个 CORS 更改为 {"*"} 将错误更改为 405 - Method not allowed。谢谢
-
尝试将
AllowedMethods()变回原来的样子。您的客户端应该发送 2 个请求,一个具有OPTIONS方法,另一个应该是GET(针对此特定请求)。还原AllowedMethods后,尝试再次发送请求,如果错误仍然存在,请使用来自GET请求的数据更新问题。