当端点不接受 OPTIONS 方法时如何解决 CORS 问题?
How to solve the CORS issue when the endpoint doesn't accept OPTIONS method?
我正在构建移动客户端应用程序以轻松管理 Magento E-commerce 商店,我正在使用基于令牌的身份验证 here,我正在为我的移动框架使用 ionic2。
我的问题是,angular HTTP 被发送 OPTIONS
请求而不是 POST
到产生 400 bad request
的 /V1/integration/admin/token
端点,因为端点不不支持 OPTIONS
方法。
这是我的代码:
import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions } from '@angular/http';
import 'rxjs/add/operator/map';
import { BaseConfig } from '../../config';
@Injectable()
export class AuthProvider {
public data: any;
public option: any;
constructor(public http: Http) {
console.log('Hello AuthProvider Provider');
}
login(creds: any) {
let headers = new Headers({
'Content-Type': 'application/json'
});
let option = new RequestOptions({
headers: headers,
});
return new Promise((resolve) => {
this.data = this.http.post(BaseConfig.base_url + 'integration/admin/token', creds, option)
.map(res => res.json())
.subscribe((data) => {
resolve(this.data);
},
(error) => {
resolve(this.data);
}
);
});
}
}
我还在我的 .htaccess
中包含了 CORS header
Header add Access-Control-Allow-Origin: "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
Header add Access-Control-Allow-Headers: "Content-Type"
所以真正的问题是如何防止 angular 使用 OPTIONS
方法请求的 http(我认为不可能,因为是预检请求)。
谢谢!
您可以在两者之间添加自己的服务器(如代理)(当 HTML 内容从相同的 URL+ 端口加载时不需要 CORS)
或者您可以使用 JSONP,但它非常有限。
否则您需要配置服务器以支持 OPTIONS
。 OPTIONS
请求是预检请求,如果浏览器未从 OPTIONS
请求获得预期响应,则浏览器不会发出 POST
请求。
可能下面的例子可以让你得到你想要的东西。
login(creds: any) {
let headers = new Headers({
'Content-Type': 'application/json',
});
let option = new RequestOptions({
headers: headers,
withCredentials:true
});
return new Promise((resolve) => {
this.data = this.http.post(BaseConfig.base_url + 'integration/admin/token', creds, option)
.map(res => res.json())
.subscribe((data) => {
resolve(this.data);
},
(error) => {
resolve(this.data);
}
);
});
}
我不知道原因,但我认为你应该在真实设备上尝试一下。
我正在构建移动客户端应用程序以轻松管理 Magento E-commerce 商店,我正在使用基于令牌的身份验证 here,我正在为我的移动框架使用 ionic2。
我的问题是,angular HTTP 被发送 OPTIONS
请求而不是 POST
到产生 400 bad request
的 /V1/integration/admin/token
端点,因为端点不不支持 OPTIONS
方法。
这是我的代码:
import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions } from '@angular/http';
import 'rxjs/add/operator/map';
import { BaseConfig } from '../../config';
@Injectable()
export class AuthProvider {
public data: any;
public option: any;
constructor(public http: Http) {
console.log('Hello AuthProvider Provider');
}
login(creds: any) {
let headers = new Headers({
'Content-Type': 'application/json'
});
let option = new RequestOptions({
headers: headers,
});
return new Promise((resolve) => {
this.data = this.http.post(BaseConfig.base_url + 'integration/admin/token', creds, option)
.map(res => res.json())
.subscribe((data) => {
resolve(this.data);
},
(error) => {
resolve(this.data);
}
);
});
}
}
我还在我的 .htaccess
中包含了 CORS headerHeader add Access-Control-Allow-Origin: "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
Header add Access-Control-Allow-Headers: "Content-Type"
所以真正的问题是如何防止 angular 使用 OPTIONS
方法请求的 http(我认为不可能,因为是预检请求)。
谢谢!
您可以在两者之间添加自己的服务器(如代理)(当 HTML 内容从相同的 URL+ 端口加载时不需要 CORS)
或者您可以使用 JSONP,但它非常有限。
否则您需要配置服务器以支持 OPTIONS
。 OPTIONS
请求是预检请求,如果浏览器未从 OPTIONS
请求获得预期响应,则浏览器不会发出 POST
请求。
可能下面的例子可以让你得到你想要的东西。
login(creds: any) {
let headers = new Headers({
'Content-Type': 'application/json',
});
let option = new RequestOptions({
headers: headers,
withCredentials:true
});
return new Promise((resolve) => {
this.data = this.http.post(BaseConfig.base_url + 'integration/admin/token', creds, option)
.map(res => res.json())
.subscribe((data) => {
resolve(this.data);
},
(error) => {
resolve(this.data);
}
);
});
}
我不知道原因,但我认为你应该在真实设备上尝试一下。