当 Angular 请求 Rails 时 Access-Control-Allow-Origin 出错
Error in Access-Control-Allow-Origin when Angular request to Rails
我正在使用 Angular 2 发出 API(rails) 请求。当我通过 angular 发出 http 请求时,出现以下错误:
XMLHttpRequest 无法加载 https://api-url. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' 因此不允许访问。响应具有 HTTP 状态代码 404。
但是,如果我尝试通过 Postman 或浏览器本身发出请求,我不会收到任何错误。数据显示正常
angular代码:
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;
})
}
在我的 rails 服务器中,我使用 gem 'jsonapi-resources' 打开 AP。在我的 api 控制器中,我有此代码进行身份验证并将 headers 设置为请求:
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
当我在浏览器或使用 postaman 中发出请求时,header 正常显示,但在 Angular 中出现错误。
这是因为 CORS. Long story short, browsers forbid by default one domain (http://localhost:4200) to make AJAX requests to another one (http://api-url)。它在 "postman" 中工作,因为这是一个扩展,因此 CORS 不适用。如果你想解决这个问题,你必须将你的服务器配置为 returns 某些 header 告诉客户端它允许 CORS 连接。
事实上,当一个网站试图向另一个域发出 AJAX 请求时,它首先发送一个 OPTION
请求来询问允许的域是什么。该列表由服务器通过 header Access-Control-Allow-Origin
返回。例如,它可以包含星号 ("*") 以指示任何人都可以 AJAX 调用此服务器。如果此 header 允许您的客户端进行 AJAX 调用,您的实际请求将被执行,否则,您将收到一个错误(可能是您当前收到的错误)
我正在使用 Angular 2 发出 API(rails) 请求。当我通过 angular 发出 http 请求时,出现以下错误: XMLHttpRequest 无法加载 https://api-url. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' 因此不允许访问。响应具有 HTTP 状态代码 404。 但是,如果我尝试通过 Postman 或浏览器本身发出请求,我不会收到任何错误。数据显示正常 angular代码:
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;
})
}
在我的 rails 服务器中,我使用 gem 'jsonapi-resources' 打开 AP。在我的 api 控制器中,我有此代码进行身份验证并将 headers 设置为请求:
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
当我在浏览器或使用 postaman 中发出请求时,header 正常显示,但在 Angular 中出现错误。
这是因为 CORS. Long story short, browsers forbid by default one domain (http://localhost:4200) to make AJAX requests to another one (http://api-url)。它在 "postman" 中工作,因为这是一个扩展,因此 CORS 不适用。如果你想解决这个问题,你必须将你的服务器配置为 returns 某些 header 告诉客户端它允许 CORS 连接。
事实上,当一个网站试图向另一个域发出 AJAX 请求时,它首先发送一个 OPTION
请求来询问允许的域是什么。该列表由服务器通过 header Access-Control-Allow-Origin
返回。例如,它可以包含星号 ("*") 以指示任何人都可以 AJAX 调用此服务器。如果此 header 允许您的客户端进行 AJAX 调用,您的实际请求将被执行,否则,您将收到一个错误(可能是您当前收到的错误)