我正在编写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);
}
};}]);
答案 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
的服务。