我有一个离子应用程序,我使用restangular与节点表达应用程序进行通信。
当我将node express应用程序配置为使用http时,一切正常。
Ionic App方面:
RestangularProvider.setBaseUrl('http://11.22.33.44:3000');
// custom header
interceptors.serialNumber = function (element, operation, what, url, headers, query) {
return {
headers: angular.extend({
'x-serialnumber': deviceStore.serialNumber
}, headers)
};
};
Restangular.one(‘Admin’).get()
.then(function (data) {
console.log(data);
}, function (error) {
console.log(error);
});
Node Express App端:
var app = express();
app.use(cors());
app.get('/Admin, function(req, res) {
console.log(admin-get');
res.send(200);
});
我期待我需要处理飞行前的请求,因为cors节点模块声明:“一个复杂的例子' CORS请求是一个使用除GET / HEAD / POST之外的HTTP动词(例如DELETE)或使用自定义标题的请求。“所以我不确定为什么会这样做?
我将Ionic App和Node Express应用程序重新配置为使用https地址而不是http:
Ionic App方面:
RestangularProvider.setBaseUrl('https://11.22.33.44:3000');
// custom header
interceptors.serialNumber = function (element, operation, what, url, headers, query) {
return {
headers: angular.extend({
'x-serialnumber': deviceStore.serialNumber
}, headers)
};
};
Restangular.one(‘Admin’).get()
.then(function (data) {
console.log(data);
}, function (error) {
console.log(error);
});
Node Express App端:
var app = express();
app.use(cors());
app.get('/Admin, function(req, res) {
console.log(admin-get');
res.send(200);
});
当Ionic App执行GET请求时,我会在“网络”下的Chrome调试器中看到取消的OPTIONS请求(请求状态)。这告诉我,我需要在我的Node Express App端启用cors(虽然为什么在服务器配置了http而不是https时我没有看到这个错误?)。
所以我根据快递js cors模块文档在Node Express App端尝试了以下内容:
app.options('Admin', cors()); // enable pre-flight request
app.get('/Admin', cors(), function(req, res) {
console.log('admin-get');
res.send(200);
});
我在“网络”下的Chrome调试器中看到相同的内容 - 取消取消的OPTIONS请求(请求状态)。我也试过
app.options('*', cors());
具有相同的结果。
然后我在Ionic App端删除了自定义标题(x-serialnumber)的插入。它现在有效。
那么,为什么Node Express应用程序配置了一个http地址而没有处理飞行前的请求,我希望由于在Ionic App端插入一个自定义标题?
当Node Express应用程序配置了https地址(以及Ionic App端)时,为什么我不处理OPTIONS请求?我配置cors的方式不正确吗?我错过了什么?
我认为这是一个cors问题,因为我可以在配置为https地址的情况下消除Ionic App端的自定义标头并且它可以工作。
我需要做些什么来实现这个目标?
更新
我尝试使用Angular JS $ http而不是Restangular。我得到了以下结果:
$http({
method: 'GET',
url: theUrl
}).then(function successCallback(response) {
$http({
method: 'GET',
url: theUrl,
headers: {
'x-serialnumber' : deviceStore.serialNumber
}
}).then(function successCallback(response) {
}, function errorCallback(response) {
});
}, function errorCallback(response) {
});
我在Chrome网络调试器中看到第一个GET(减去自定义标头)消失了,我得到了一个很好的响应(200),然后是OPTIONS请求,我也得到了很好的响应( 200),然后是一个很好的GET,里面有自定义标题(得到很好的回复)。
如果我 NOT 执行此第一个GET请求减去自定义标头,则OPTIONS请求将在Angular JS Ionic App端中止,状态为-1。
注意:我可以更改Restangular请求的初始$ http请求(减去自定义标头)(减去自定义标头)
为什么这个初始GET减去了所需的自定义标头(即GET(减去自定义标题)| OPTIONS | GET(带有自定义标题))?
我不明白什么?
答案 0 :(得分:0)
我需要做的是以下内容:
$http({
method: 'GET',
url: 'https://example.com/DUMMY'
}).then(function successCallback(response) {
$http({
method: 'GET',
url: 'https://example.com',
headers: {
'x-serialnumber': deviceStore.serialNumber
}
}).then(function successCallback(response) {
console.log('SUCCESS');
}, function errorCallback(response) {
console.log('FAILURE');
});
}, function errorCallback(response) {
console.log('FAILURE');
});
从本质上讲,我需要发送一个" 初步"使用否自定义标头获取请求。 GET请求可以是我的节点快速服务器上的任何内容。在此之后" 初步" GET请求,我可以使用自定义标头执行GET请求。
特别是在服务器端,我看到以下内容:
GET /DUMMY 200 10ms - 2b
OPTIONS / 204 1ms
GET / 200 13ms - 1.03kb
不执行此操作" 初步"获取请求,我的Ionic App中的OPTIONS请求将中止 - 状态代码= -1 - 通常意味着请求已中止,并且永远不会离开Ionic App端。
我仍然不明白为什么我需要这个" 初步" GET请求,但这对我有用。