如果$ http.post返回特定的错误代码,您能告诉我重定向到另一个页面的正确方法吗?
只是为了添加上下文,如果用户未登录或未授权使用API,我想重定向到另一个页面。
function getData(filter) {
var deferred = $q.defer();
var data = JSON.stringify(filter);
$http.post('/myapp/api/getData', data)
.success(function (data, status, headers, config) {
deferred.resolve(data);
})
.error(function (error) {
deferred.reject(error);
});
return deferred.promise;
}
答案 0 :(得分:3)
在角度中捕获全局AuthenticationError
的最佳方法是使用拦截器。
这样,您就可以监控从角度发送的所有请求,并检查AuthenticationError
。
$provide.factory('AuthErrorInterceptor', function($q, $location) {
return {
'responseError': function(rejection) {
//check for auth error
$location.path('/login');
return $q.reject(rejection);
}
};
});
答案 1 :(得分:3)
示例:
import java.util.*;
答案 2 :(得分:3)
使用拦截器服务将所有拒绝请求集中在同一服务中。
module.config(['$httpProvider', ($httpProvider: ng.IHttpProvider) => {
$httpProvider.interceptors.push('errorService');
}]);
module.factory('errorService', ['$location', function($location) {
var errorService = {
responseError: function(rejection) {
if (rejection === '401') {
$location.path('/login');
}
}
};
return errorService;
}]);
答案 3 :(得分:2)
根据您的错误情况,您可以使用$ window.location.href重定向到页面。
var app = angular.module("sampleApp", []);
app.controller("sampleController", [
"$scope",
'$window',
'sampleService',
function($scope, $window, sampleService) {
sampleService.getData().then(function(result) {}, function(error) {
if (error.statusCode === 400) {
alert("Error");
$window.location.href = "http://stackoverflow.com"
}
});
}
]);
app.service("sampleService", function() {
this.getData = function() {
var promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject({
statusCode: 400
});
}, 1000);
});
return promise;
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-App="sampleApp">
<div ng-controller="sampleController">
</div>
</div>
答案 4 :(得分:2)
首先不错的问题,在这种情况下你可以使用 $ location , $ state 如果是外部网址你可以使用$ window.location.href ..我会推荐$ location,这是最好的方式......
请参阅更多Using $window or $location to Redirect in AngularJS
的链接$.each(req,function(i,item){
var val=$.format.date(req[i].from_date, "dd/MMM/yyyy");
console.log(val); //'2016-10-15'
});
最好使用$ location或$ state ...
答案 5 :(得分:2)
$ http.post是错误的。 到目前为止,最好的答案是@Kliment&#39; s。拦截器是管理http请求之前和之后的最佳方式。
但是,如果您的最终目标是阻止访问某个网页,您必须至少使用路由插件(ngRoute,ui-router),因为有了承诺的想法,总会有是http请求和响应之间的延迟。
根据服务器响应时间,您仍会看到页面显示大约一秒左右。
使用ui-router,您只需为要保护的每个州配置resolve方法。它看起来像这样:
.state('protected',
{
url : '/protected_page',
templateUrl : 'secret.html',
resolve: {
loggedin: loggedin
}
})
loggedin 是指您定义的包含$ http.post调用的函数(或更好的服务)
function loggedin($timeout, $q, $location, loginService) {
loginService.then(function(data) {
if(data.status == 401) {
//$timeout(function() { $location.path('/login'); });
return $q.reject();
} else {
return $q.when();
}
});
}
此特定服务返回401状态,但您可以返回任何内容。
在接受或拒绝状态之前,状态不会得到解决(页面也不会显示)。
如果您愿意,可以直接从那里重定向,尽管它不是很优雅。 ui-router为您提供了默认重定向的另一个选项:
if (tokenIsValid())
$urlRouterProvider.otherwise("/home");
else
$urlRouterProvider.otherwise("/login");
使用否则,如果特定请求没有状态或拒绝解决,则告诉ui-router转到某些URL。
在另一个主题上,您的http request写得不好。
.success 和 .error 已弃用,您不需要在$上创建承诺( $ q ) http请求本身已经返回一个promise。
您在上面链接的文档中有一个很好的例子。
答案 6 :(得分:2)
您可以根据您可以从API调用返回的状态代码重定向到未经授权访问用户的页面。
$http({
method: "POST",
url: 'Api/login',
headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
}).success(function (data,status) {
if(status==200){
alert('Successfully logged in');
$location.path('/dashboard'); //You can use this if you are defined your states.
}
}).error(function (data,status) {
if(status==403||status==403){ //Based on what error code you are returning from API
$location.path('/login');// if states are defined else
$window.location.href = "https://www.google.com";
}
});