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

Rob*_*boy 8 asp.net-web-api angularjs

如果$ 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;
  }
Run Code Online (Sandbox Code Playgroud)

gyc*_*gyc 2

$http.post 具有误导性。到目前为止,最好的答案是@Kliment。拦截器是管理 http 请求之前和之后发生的内容的最佳方式。

但是,如果您的最终目标是阻止访问页面,则至少必须使用路由插件(ngRoute、 ui-router),因为根据 Promise 的想法,http 请求和响应之间总会存在延迟。

根据服务器响应时间,您仍然会看到页面显示大约一秒钟左右。

使用 ui-router,您只需为要保护的每个状态配置解析方法即可。它可能看起来像这样:

.state('protected',
{
    url : '/protected_page',
    templateUrl : 'secret.html',
    resolve: {
        loggedin: loggedin
    }
})
Run Code Online (Sandbox Code Playgroud)

login指的是您定义的包含 $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();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

此处此特定服务返回 401 状态,但您可以返回任何内容。

在接受或拒绝之前,状态不会得到解决(并且页面不会显示)。

如果需要,您可以直接从那里重定向,尽管这不是很优雅。ui-router 为您提供了另一种默认重定向的选项:

if (tokenIsValid()) 
    $urlRouterProvider.otherwise("/home");
else
    $urlRouterProvider.otherwise("/login");
Run Code Online (Sandbox Code Playgroud)

否则如果特定请求不存在状态或者解析被拒绝,则告诉 ui-router 转到某些 url。

在另一个主题上,你的http请求写得不好。

.success.error已被弃用,并且您不需要在本身已经返回承诺的 $http 请求上创建承诺 ( $q )。

上面链接的文档中有一个很好的例子。