这是我的第一篇帖子。
我刚开始学习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 Dev Tools 的头部信息
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
是不同的来源。我不确定如何以“angular 5”的方式处理这个问题,但是webpack-dev-server
在package.json
中有一个超级简单的proxy
字段,你基本上想要复制它。 - bcr{"*"}
,问题是否仍然存在? - MihailoAllowedMethods()
改回原来的状态。你的客户端应该发送两个请求,一个是使用OPTIONS
方法,另一个是使用GET
方法(对于这个特定的请求)。在还原AllowedMethods
后,再次发送请求,如果错误仍然存在,请更新问题并提供GET
请求的数据。 - Mihailo