我正在Go中开发一个API restful和Angular中的前端(没有AngularJS),但是当我从Angular的Web App调用我的API时,我的后端没有看到我的标题,特殊情况下我的授权标题,因为我的API具有基于JWT的身份验证。
另外我想提一下,我正在使用Postman和Go Request客户端测试我的应用程序,我的标题在我的API中提供没有问题。
下面是我的后端的CORS和我前端的API调用。
我的后端:
func Cors() gin.HandlerFunc {
log.Println("CORS Middleware")
return func(c *gin.Context) {
c.Writer.Header().Add("Access-Control-Allow-Origin", "*")
c.Next()
}
}
我的前端:
getData() {
const auth = `Bearer ${this.token}`;
const headers = new Headers({
'Access-Control-Allow-Origin': '*',
'Accept': 'application/json',
'Authorization': auth,
});
const options = new RequestOptions(headers);
console.log(headers); //Here I can see
const products = this.http.get('localhost:8000/api/products', options )
.subscribe((response: Response) => {
this.data = response.json();
});
return products;
}
感谢和抱歉我的英语,我认为我的CORS会导致问题。
答案 0 :(得分:0)
而不是
const options = new RequestOptions(headers);
执行:
const options = new RequestOptions({ headers: headers });
constructor for RequestOptions
需要RequestOptionsArgs
,而不是Headers
。
此外,您似乎还不太了解CORS。您并不需要从前端向后端发送任何标头(浏览器会在发现它是CORS请求时自动附加您需要的内容)。那些标题(Access-Control-Allow-Origin
)应仅由服务器发送。
对于你的后端,这里有一个改进的建议(应该处理大多数情况):
func Cors() gin.HandlerFunc {
log.Println("CORS Middleware")
return func(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
c.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
c.Writer.Header().Set("Access-Control-Expose-Headers", "Content-Length")
c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
c.Writer.Header().Set("Access-Control-Max-Age", "86400")
// c.Writer.Header().Set("Content-Type", "application/json") // uncomment if needed
if c.Request.Method == "OPTIONS" {
fmt.Println("OPTIONS")
c.AbortWithStatus(200)
} else {
c.Next()
}
}
}