我正在尝试访问一个rest api源,它正在使用邮递员或http请求者工作。我的代码出了什么问题?
let keyUrl ="yourUrl"
getAPIKey(){
let headers = new Headers();
// headers.append('Content-Type', 'text/plain');
headers.append('Authorization', 'Bearer ' + btoa(this.cred.user + ":" + this.cred.pw));
headers.append('Access-Control-Allow-Methods', 'GET, POST, PUT');
headers.append("Access-Control-Allow-Headers","*");
let options = new RequestOptions({
headers: headers,
method: RequestMethod.Post,
});
return this.http.post(this.keyUrl,options)
.map((res: Response) => {
console.log('##############')
console.log(res.json())
})
.catch(this.handleError)
.subscribe(
status => console.log(status),
error => this.handleError(error),
() => console.log('DONE')
);
}
我总是得到错误:
对预检请求的响应未通过访问控制检查:否 '访问控制允许来源'标题出现在请求的上 资源。起源' http://localhost:4200'因此是不允许的 访问。
在我的后端,帖子请求为"选项"即使我发送了http.post。
答案 0 :(得分:0)
我也遇到了这个问题,我花了很长时间才找到合适的解决方案
您还必须在服务器端设置标头。他们基本上需要接受“OPTIONS” - 请求。
这可能取决于托管REST-API的服务器;如果你使用的是Apache-Server,你可以将它添加到你的httpd.conf中,它应该可以工作:
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Header set Access-Control-Allow-Origin "jakartab3:16090, epbtesti:16090, localhost:16090"
Header set Access-Control-Allow-Credentials "true"
Header add Access-Control-Allow-Headers "Content-Type, Accept"
Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
或者,它也应该在您处理安全性的点上工作(如果这样做)。在这种情况下,设置HttpServletResponse的标题,如
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Origin-Methods", "GET, POST, OPTIONS");
希望这可以解决您的问题
编辑:试图解释为什么你需要设置它:
Access-Control-Allow-Origin阻止其他服务器访问您的REST服务 - 您的角度应用程序在它自己的服务器上运行,在端口4200上。为了使角度应用程序能够访问您的REST服务,正如我已经说过的,您需要根据我的回答在托管REST服务的服务器中设置标头;它无法在其他地方工作,因为此安全功能会阻止其他服务器访问您的REST服务