加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 使用$http transformResponse的angular-http-auth

发布时间:2020-12-17 17:24:27 所属栏目:安全 来源:网络整理
导读:每当从服务器返回401“未授权”响应时,我正在使用 angular-http-auth来显示登录对话框. 由于我很酷,我也尝试在我的服务中反序列化响应对象.例如,如果服务请求汽车并且响应是{make:Honda,model:Civic},我尝试使用transformResponse将其反序列化为Car对象.
每当从服务器返回401“未授权”响应时,我正在使用 angular-http-auth来显示登录对话框.

由于我很酷,我也尝试在我的服务中反序列化响应对象.例如,如果服务请求汽车并且响应是{make:Honda,model:Civic},我尝试使用transformResponse将其反序列化为Car对象.

例如:

getCar: function() {
    return $http.get('/api/car',{
        method: 'GET',transformResponse: function(data,headers) {
            var c = angular.fromJson(data);
            return new Car(c);
        }
    });
}

这不适用于angular-http-auth.如果响应是401 Unauthorized,您将收到一个javascript错误.这是因为即使响应是401,angular也会尝试运行transformResponse代码.

事实证明,$http拦截器(这是angular-http-auth使用的)在transformResponse代码之后运行.这是一个很大的问题,因为如果服务器响应是401(没有任何数据),transformResponse中的代码都不会起作用

这对其他人来说是个问题吗?你是怎么绕过它的?如果我使用$http拦截器,我不会使用transformResponse吗?

解决方法

我知道,在聚会的最后阶段,但对于像我一样从谷歌来到这里的人(我也发布了这篇文章作为对Angular回购提交的 related issue的评论):

我还发现,令人困惑的是,响应拦截器在transformResponse方法之后运行.我在$http.defaults.transformResponse中添加了一个方法. Here是有关如何执行此操作的文档中的示例.

所以,如果你需要基本上有一个在transformResponse方法之前运行的响应拦截器,这应该这样做:

'use strict';

angular.module('app')
  .run(function ($http) {
    $http.defaults.transformResponse.push(function (data,headers) {
      // do stuff here before the response transformation

      // Be sure to return `data` so that the next function in the queue can use it.
      // Your services won't load otherwise!
      return data;
    });
  });

如果您的服务或http呼叫没有自己的响应转换器,那么您现在很好.

如果您的服务确实有自己的transformResponse方法,它们实际上会覆盖所有默认变换器(我在长时间阅读文档后发现了这一点),并且上面的代码将无法运行.

为了避免这种情况,您可以在文档中按照this example进行操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读