Javascript Angularjs:如何拦截外部url$resource或$http服务中的错误?
我的grunt服务器为angularjs应用程序提供服务,而grunt服务器与我的grunt服务器不同,我的服务器上有一项服务可用。Javascript Angularjs:如何拦截外部url$resource或$http服务中的错误?,javascript,angularjs,cors,Javascript,Angularjs,Cors,我的grunt服务器为angularjs应用程序提供服务,而grunt服务器与我的grunt服务器不同,我的服务器上有一项服务可用。 外部服务器是一个Apache服务器,使用PHP提供JSON数据。 我想截获任何可能的服务器错误(从“服务器关闭”到“404”…) 我尝试过使用拦截器,方法如下: app.factory('myFactory', function($resource) { return $resource('http://www.remote.server.com/api/WR
外部服务器是一个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错误时停止…
如果我用本地url更改远程url,一切正常 是否有可能处理angular.js$resource(或$http)远程请求错误?
我也会接受一个设计转变的建议,比如以一种类似grunt的方式重新实现我的PHP服务。。。(实际上,我的PHP服务只是从服务器文件夹打印一个JSON图像名称列表…。据我所知,这是一个与CSRF/XSRF保护有关的问题,而不是AngularJS。在其他框架或poj中也会遇到同样的问题。在PHP中,如果要跨域访问内容,需要启用CORS,并且需要指定需要访问或打开内容的服务器 本质上,AngularJS被约束到浏览器提供的响应,而浏览器反过来又约束响应,因为请求由于XSRF保护而未经授权。此外,关于AngularJS和XSRF,它将读取令牌会话cookie(由服务器提供),并在后续请求中将其放入HTTP头中,然后由服务器决定是否接受它
$http据我所知,这是一个与CSRF/XSRF保护相关的问题,而不是AngularJS。在其他框架或poj中也会遇到同样的问题。在PHP中,如果要跨域访问内容,需要启用CORS,并且需要指定需要访问或打开内容的服务器 本质上,AngularJS被约束到浏览器提供的响应,而浏览器反过来又约束响应,因为请求由于XSRF保护而未经授权。此外,关于AngularJS和XSRF,它将读取令牌会话cookie(由服务器提供),并在后续请求中将其放入HTTP头中,然后由服务器决定是否接受它
$http我相信你把你的拦截器推到了错误的地方。指示您应该推到以下位置:
$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);
}
};
});
工作plnkr:我相信你把你的拦截器推错地方了。指示您应该推到以下位置:
$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);
}
};
});
工作许可证:谢谢。我确实在我的PHP页面中启用了CORS访问(
..),但问题是我想拦截服务器关闭或404之类的错误,当然这些错误甚至不涉及脚本代码…谢谢。我确实在我的PHP页面中启用了CORS访问(
..),但问题是我想截获服务器停机或404之类的错误,这当然不涉及脚本代码…谢谢,但这种方式唯一的区别是我截获了所有响应,甚至是良好的(200)响应,而不是仅截获错误响应。。。然而,即使添加一个404案例,它也不会截获404错误……那么,使用上面的responseInterceptors也会截获所有响应。我只是建议你使用angular建议的格式。您可以使用现有的switch语句过滤它们。你能编一个“也许”吗?我用你的原始代码做了一个plnkr,它只是工作:谢谢!它可以扩展到$resource而不是ng click吗?拦截器适用于所有基于http的操作,这就是为什么在我的示例plnkr中可以工作的原因。它不绑定到ng click,ng click只是用来调用控制器作用域上的一个方法,该方法反过来使用在工厂中创建的资源。谢谢,但这种方式唯一的区别是我截获了所有响应,甚至是好的(200个)响应,而不仅仅是错误响应。。。然而,即使添加一个404案例,它也不会截获404错误……那么,使用上面的responseInterceptors也会截获所有响应。我只是建议你使用angular建议的格式。您可以使用现有的switch语句过滤它们。你能编一个“也许”吗?我用你的原始代码做了一个plnkr,它只是工作:谢谢!它可以扩展到$resource而不是ng click吗?拦截器适用于所有基于http的操作,这就是为什么在我的示例plnkr中可以工作的原因。它没有绑定到ng click,ng click只是用来调用控制器作用域上的一个方法,该方法反过来使用在工厂中创建的资源。