我在与我的grunt服务器不同的服务器上提供服务,该服务器为我的angularjs应用程序提供服务 外部服务器是Apache服务器,使用PHP提供JSON数据。 我想拦截任何可能的服务器错误(从“服务器关闭”到“404”......)。
我试过这样使用拦截器:
app.factory('myFactory', function($resource) {
return $resource('http://www.remote.server.com/api/WRONGPATH',
});
app.config(function ($routeProvider, $httpProvider) {
...
$httpProvider.responseInterceptors.push(function($q) {
return function(promise) {
return promise.then(function(successResponse) {
if (successResponse.config.method.toUpperCase() !== 'GET') {
console.info('success');
}
return successResponse;
}, function(errorResponse) {
switch (errorResponse.status) {
case 401:
console.info('wrong usename or password');
break;
case 403:
console.info('no rights to do this');
break;
case 500:
console.info('server internal error: ' + errorResponse.data);
break;
default:
console.info('error ' + errorResponse.status + ': ' + errorResponse.data);
}
return $q.reject(errorResponse);
});
};
});
});
没有成功:我总是落入'默认'开关案例,errorResponse.status == 0
我想这是因为浏览器在拦截CORS错误时停止了...
如果我用本地网站更改远程网址,一切正常......
是否有可能处理angular.js $ resource(或$ http)远程请求错误?
我也会接受一个设计转换建议,比如以类似grunt的方式重新实现我的PHP服务......(我的PHP服务 - 实际上 - 只是从服务器文件夹打印一个JSON的图像名列表.. )。
答案 0 :(得分:4)
我相信你会把你的拦截器推到错误的地方。 $http docs表示您应该继续推进:
$httpProvider.interceptors
而不是:
// I can only find references to this on old tutorials, so maybe it's been deprecated
$httpProvider.responseInterceptors
所以你有类似的东西:
$httpProvider.interceptors.push(function($q) {
return {
'response': function(response) {
if (successResponse.config.method.toUpperCase() !== 'GET') {
console.info('success');
}
return response || $q.when(response);
},
'responseError': function(response) {
switch (response.status) {
case 401:
console.info('wrong usename or password');
break;
case 403:
console.info('no rights to do this');
break;
case 500:
console.info('server internal error: ' + response.data);
break;
default:
console.info('error ' + response.status + ': ' + response.data);
}
return $q.reject(response);
}
};
});
work plnkr:here
答案 1 :(得分:0)
据我了解,这是一个与CSRF / XSRF保护有关的问题,而不是AngularJS。您将在其他框架或poj中获得相同的问题。在PHP中,如果要跨域访问内容,则需要启用CORS,并且需要指定需要访问或打开它的服务器。
http://www.w3.org/wiki/CORS_Enabled http://enable-cors.org/server_php.html
基本上AngularJS受限于浏览器提供的响应,而后者又限制了响应,因为XSRF保护导致请求未经授权。此外,关于AngularJS和XSRF,它将读取令牌会话cookie(由服务器提供)并将其放入后续请求中的HTTP头中,然后由服务器决定是否接受它。