我正在尝试访问REST API源,并且它正在与Postman或HTTP Requester一起找到。我的代码怎么了?
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。
我也遇到了这个问题,我花了很长的时间才能找到正确的解决方案
您也必须在服务器端设置标头。他们本质上需要接受"选项" - 要求。
这可能取决于您的服务器托管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-wall-wall-ofrigin可防止其他服务器访问您的休息服务 - 并且您的Angular-application在端口4200上运行在其自己的服务器上。对于Angular-Application,可以访问您的休息服务,正如我已经说过的,您需要根据我的答案设置服务器中托管休息服务的标题;它无法在其他地方工作,因为此安全功能可防止其他服务器访问您的休息服务