2

我正在使用Angular 2来提出API(rails)请求。当我通过角度发出http请求时,出现以下错误: XMLHttpRequest无法加载https://api-url。对预检请求的响应不会通过访问控制检查:请求的资源上不存在“访问控制 - 允许来源”标头。因此不允许访问原产地'http://localhost:4200'。该响应的HTTP状态码为404. 但是,如果我尝试通过邮递员或浏览器本身发出请求,则不会收到任何错误。的数据被显示正常 角代码:错误的访问控制 - 允许来源当角度请求导轨

makeRequest() { 
    let user = {"user": "user", "password": "password"}; 
    let headers: Headers = new Headers(); 
    headers.append('Authorization', 'Basic ' + btoa(user.user + ':'+user.password)); 
    headers.append('Content-Type', 'application/vn.api+json') 
    let this.http.get(api-url, {headers: headers}).map(res => res.json()).subscribe(data => { 
    this.data = data; 
    }) 
} 

以我导轨服务器I使用宝石“jsonapi-resources'to开放AP。在我的API控制器,我有这样的代码来验证和设置头的请求:当我在浏览器或使用postaman做出请求

module Api 
    class ApiController < JSONAPI::ResourceController 
    prepend_before_action :set_headers, :authenticate 

    def context 
     { current_station: @user } 
    end 

    private 

    def authenticate 
     authenticate_or_request_with_http_basic do |token, _| 
     @user = User.where(api_key: token).first 
     end 
    end 

    def set_headers 
     response.headers["Access-Control-Allow-Origin"] = "*" 
    end 
    end 
end 

,头常出现,但在角我有错误。

回答

2

这是因为CORS。长话短说,浏览器默认禁止一个域(http://localhost:4200)向另一个域(http://api-url)发出AJAX请求。它适用于“邮差”,因为这是一个扩展,然后,CORS不适用。如果你想解决这个问题,你必须配置你的服务器返回某个头部,告诉客户它允许CORS连接。

事实上,当一个网站试图向另一个域发出AJAX请求时,它首先发送一个OPTION请求,询问允许的域是什么。该列表由服务器通过标头Access-Control-Allow-Origin返回。例如,它可以包含一个星号(“*”)来表示任何人都可以对此服务器进行AJAX调用。如果这个头允许你的客户端进行AJAX调用,你的实际请求将被执行,否则你会得到一个错误(可能是你当前得到的)

相关问题