2016-08-11 43 views
0

长话短说。我真的不是AngularJS大师。我们的网站从1.3升级到1.5。这一件事正在打破。AngularJS 1.3到1.5的transformRequest破解了,解决了我的具体情况?

我们使用通过transformRequest在一个名为“API”工厂注入HTTP头:

.factory('api', function($resource) { 
    function add_auth_header(data, headersGetter) { 
     var headers = headersGetter(); 
     headers['Authorization'] = ('Basic ' + btoa(data.username + 
       ':' + data.password)); 
    } 
    // defining the endpoints. 
    return { 
     auth: $resource('/api/v1/auth/', {}, { 
      login: {method: 'POST', transformRequest: add_auth_header}, 
      logout: {method: 'DELETE'}, 
     }), 

后来在同一文件中,这被称为像这样:

.service('auth', function($cookies, $rootScope, api) { 
    this.user = null; 
    this.login = function(credentials) { 
     var log = api.auth.login(credentials); 
     log.$promise.then(function(data){ 
      // on good username and password 
      this.user = data; 
     }); 

正如你可以看到,它使用凭据调用api.auth.login。我已经证实转换请求正在被调用,头文件正在被headersGetter()正确提取,并且挂起头文件[]对象不再像在1.3中那样改变它。 Fiddler验证该请求不再像在1.3中那样拥有授权标头,并且获取请求的Django服务器也同意。

我已经在几个地方看到了1.4中的transformRequest功能“爆发”,但是这些帖子总是处于发出$ http请求的上下文中,而不是通过工厂提供api服务,对于像我这样的AngularJS newb非常有意义。我不知道从哪里开始改变Authorization的注入方式。

任何人都可以指点我吗?

+0

说真的,没有评论为什么downvote?这是一个完全合法的问题。 –

回答

0

如果其他人仍然面临这种情况,那么这个变化是在1.4的变更日志中发生重大变化。

我觉得这个解决方案可以说明一切。请注意,函数add_auth_header不会被调用,而是被传递。

.factory('api', function($resource) { 
    function add_auth_header(data) { 
     // as per HTTP authentication spec [1], credentials must be 
     // encoded in base64. Lets use window.btoa [2] 
     return 'Basic ' + btoa(data.data.username + ':' + data.data.password); 
    } 
    // defining the endpoints. 
    return { 
     auth: $resource('/api/v1/auth/', {}, { 
      login: {method: 'POST', headers: { 'Authorization': add_auth_header  }}, 
      logout: {method: 'DELETE'}, 
     }),