从angularjs中的$ http.post重定向的正确方法

时间:2016-10-21 21:34:22

标签: angularjs asp.net-web-api

如果$ 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;
  }

7 个答案:

答案 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";
    }
});