Symfony3 / Nelmio cors / fetch api — 400 错误请求
Symfony3 / Nelmio cors / fetch api — 400 Bad Request
正如标题所说,我有一个 symfony3 应用程序,在子域上有一个 api,因此:
GET http://ajax.localhost.dev:10190/menus
returns JSON 格式的菜单列表。
这里是 nelmio cors 包的配置 (/app/config/nelmio/cors.yml
)
nelmio_cors:
paths:
'^/':
origin_regex: true
allow_origin: ['^https?://%domain%:[0-9]+']
allow_headers: ['X-Custom-Auth']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
max_age: 3600
hosts: ['^ajax\.']
allow_credentials: true
我一直在使用这个代码:
export default class AppRemote extends Remote {
get host () { return `ajax.${super.host}`; }
open(xhr, data) {
if ("withCredentials" in xhr) {
xhr.open(data.method, this.url(data.url), true);
xhr.withCredentials = true; }
else if (typeof XDomainRequest != "undefined") {
xhr = new XDomainRequest();
xhr.open(data.method, this.url(data.url)); }
else { this.app.error('cannot init CORS Request'); }
return xhr;
}
};
工作正常。现在我正在尝试将它移植到新的提取 API 并且我正在使用此代码:
const init = (url, method = 'GET') => {
return new Request(url, {
headers: new Headers({
'Access-Control-Allow-Credentials': true,
//'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods' : 'POST, GET, OPTIONS'
}),
mode: 'cors',
credentials: true,
method });
}
const get = (url) => {
return fetch(init(url));
}
它returns一个400 Bad Request
,跟Request Method: OPTIONS
。如果我只是在浏览器中输入 url,就可以了。
我猜想存在一些身份验证问题,但就是不知道如何解决。我该怎么做?
经过一番研究,我终于找到了错误。感谢 Firefox,它抛出了一个错误,指出了我的位置:
return new Request(url, {
//headers: new Headers({
//'Access-Control-Allow-Credentials': true,
//'Access-Control-Allow-Origin': '*',
//'Access-Control-Allow-Methods' : 'POST, GET, OPTIONS'
//}), //<-- working without headers at all
mode: 'cors',
credentials: 'include', //<-- that is the right setting
method });
上的文档
正如标题所说,我有一个 symfony3 应用程序,在子域上有一个 api,因此:
GET http://ajax.localhost.dev:10190/menus
returns JSON 格式的菜单列表。
这里是 nelmio cors 包的配置 (/app/config/nelmio/cors.yml
)
nelmio_cors:
paths:
'^/':
origin_regex: true
allow_origin: ['^https?://%domain%:[0-9]+']
allow_headers: ['X-Custom-Auth']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
max_age: 3600
hosts: ['^ajax\.']
allow_credentials: true
我一直在使用这个代码:
export default class AppRemote extends Remote {
get host () { return `ajax.${super.host}`; }
open(xhr, data) {
if ("withCredentials" in xhr) {
xhr.open(data.method, this.url(data.url), true);
xhr.withCredentials = true; }
else if (typeof XDomainRequest != "undefined") {
xhr = new XDomainRequest();
xhr.open(data.method, this.url(data.url)); }
else { this.app.error('cannot init CORS Request'); }
return xhr;
}
};
工作正常。现在我正在尝试将它移植到新的提取 API 并且我正在使用此代码:
const init = (url, method = 'GET') => {
return new Request(url, {
headers: new Headers({
'Access-Control-Allow-Credentials': true,
//'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods' : 'POST, GET, OPTIONS'
}),
mode: 'cors',
credentials: true,
method });
}
const get = (url) => {
return fetch(init(url));
}
它returns一个400 Bad Request
,跟Request Method: OPTIONS
。如果我只是在浏览器中输入 url,就可以了。
我猜想存在一些身份验证问题,但就是不知道如何解决。我该怎么做?
经过一番研究,我终于找到了错误。感谢 Firefox,它抛出了一个错误,指出了我的位置:
return new Request(url, {
//headers: new Headers({
//'Access-Control-Allow-Credentials': true,
//'Access-Control-Allow-Origin': '*',
//'Access-Control-Allow-Methods' : 'POST, GET, OPTIONS'
//}), //<-- working without headers at all
mode: 'cors',
credentials: 'include', //<-- that is the right setting
method });
上的文档