将Edge服务与Angular拦截器中的正常Request进行区分

时间:2017-02-17 14:15:33

标签: angularjs http-status-code-404 angular-http-interceptors

我正在编写Angular中的拦截器来处理404响应。当请求来自REST服务时,拦截器不得拦截​​该请求。我的主要问题是区分请求何时来自页面请求或来自REST服务请求。目前我正在使用rejection.config.url中的URL并测试我的REST URL服务是否与该值匹配。虽然这种方法有效,但我认为这不是一个好的解决方案。还有其他方法或更好的方法吗?

拦截器代码:

angular.module("mainApp").factory("notFoundInterceptor",['$q','$location','$rootScope', function ($q,$location,$rootScope) {
return {
    responseError: function (rejection) {
         function isURLFromRESTService(rejection) {
            var url = /myresturl/; //pattern used to match REST URL
            return url.test(rejection.config.url);
         }  

         if (rejection.status === 404 and !isURLFromRESTService(rejection)) { // Not found
              $rootScope.notFound = {
                  erro: 'Não possível encontrar: ' + $location.url()
              }
              $location.path('/notfound');
         }

        return $q.reject(rejection);
    }
};}]);

1 个答案:

答案 0 :(得分:3)

这是另一种选择:不能说它是否更好: - | ......你决定:)

调用REST API时,传递一个带有以下标志的配置对象:

$http.get('REST API URL', { ignore404: true })

现在在您的拦截器中,您可以检查:

if (rejection.status === 404 && !rejection.config.ignore404) { 
    $rootScope.notFound = {
        erro: 'Não possível encontrar: ' + $location.url()
    }
    $location.path('/notfound');
}

当然,您需要为每个REST API调用传递此配置对象。

为此,您可能希望在$http上编写自己的包装器,添加配置对象(或者只是添加ignore404属性,如果从外部传递config对象)并使用此在调用REST API时代替$http的服务。