Angularjs:如何拦截外部url $ resource或$ http服务中的错误?

时间:2014-05-13 10:36:04

标签: javascript angularjs cors

我在与我的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的图像名列表.. )。

2 个答案:

答案 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头中,然后由服务器决定是否接受它。

https://docs.angularjs.org/api/ng/service/ $ HTTP