Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angularjs:如何拦截外部url$resource或$http服务中的错误?_Javascript_Angularjs_Cors - Fatal编程技术网

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

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

我的grunt服务器为angularjs应用程序提供服务,而grunt服务器与我的grunt服务器不同,我的服务器上有一项服务可用。
外部服务器是一个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只是用来调用控制器作用域上的一个方法,该方法反过来使用在工厂中创建的资源。