9

假设我的角度应用程序周围有几个 $resources 和一些 $http:

myApp.factory('Note', function($resource) {

  return $resource('http://', {id: '@id'}, 
    { 'index': { method: 'GET', isArray: true },
      'update': { method: 'PUT'},
    });
  });

带控制器

myApp.controller('NotesController',function NotesController($scope, Note, AuthenticationService) {

$scope.notes = Note.index({}, function(data){
    console.log('success, got data: ', data);
    $scope.response = "yoy!"
  }, function(err){
    console.log('error, got data: ', err);
    $scope.response = "yay!"
  }); 
});

并且一些请求是由 $http 直接发出的,如身份验证

var request = $http.post('http://', {email: email, password: password});

在发出实际请求/接收响应之前,我在哪里以及如何告诉 Angular 将 JSON 压缩和编码/解码为 base64?

我想我会将用于放气和编码/解码的外部库包装到工厂中。然后这个工厂会被注入到这里?喜欢 $httpBackend 吗?

4

3 回答 3

9

您应该查看服务的请求/响应转换器:http $http: //docs.angularjs.org/api/ng.$http

请求/响应转换器是可以在内容发送/返回给调用者之前调用的简单函数。您可以全局指定转换函数(针对所有请求/响应)以及基于每个请求:

要在本地覆盖这些转换,请将转换函数指定为配置对象的 transformRequest 和/或 transformResponse 属性。要全局覆盖默认转换,请覆盖 $httpProvider 的 $httpProvider.defaults.transformRequest 和 $httpProvider.defaults.transformResponse 属性。

要定义全局请求/响应转换器,可以按照这些行编写代码(它更像是伪代码,不适用于所有浏览器,请参阅下面有关 Base64 的注释):

angular.module('sample', [], function($httpProvider) {

    $httpProvider.defaults.transformRequest = function(data, headersGetter) {
        return btoa(JSON.stringify(data));
    };

    $httpProvider.defaults.transformResponse = function(data, headersGetter) {
        return JSON.parse(atob(data));
    };

})

当然,您的转换代码可能更复杂,并且取决于请求/响应标头,但总体思路就在这里。带有代码的 jsFiddle(检查控制台以查看请求是否已转换,您需要使用 Mozilla 或 WebKit 浏览器):http: //jsfiddle.net/Ydt5j/

对于从 / 到 Base64 的实际转换,请检查以下问题:如何在 JavaScript 中将字符串编码为 Base64?

于 2012-12-30T12:40:19.660 回答
2
angular.module('services.base64',[]);
angular.module('services.base64').provider('base64', function () {

  this.encode = function(str) {
    return base64_encode(str);
  }

  this.decode = function(str) {
    return base64_decode(str);
  }

  this.$get = function() {
    return {};
  }

});

var myApp = angular.module('myApp',['services.base64'])

myApp.config(['base64Provider', function (base64Provider) {
    $httpProvider.defaults.transformRequest = function(request){return base64Provider.encode(request)};

    $httpProvider.defaults.transformResponse = function(response){return base64Provider.decode(response)};
}]);
于 2012-12-31T19:25:24.157 回答
1

这就是我在过滤器中的做法。item.htmlBody 包含带有 html 标签的 base64 编码文本

// in template
<div ng-bind-html="item.htmlBody | decodeBase64">{{item.htmlBody}}</div>

//inside controller.js

.filter('decodeBase64', function(){
   return function(text){
   return atob(text);
   }
})

好吧,我知道这并不能完全回答这个问题,但是通过一些小的调整,你可以得到你想要的(针对未来有同样问题的人)

于 2014-09-04T03:16:21.560 回答