2012-12-30 42 views
8

可以說我有幾個$資源和一些$ HTTP在我的角度應用:AngularJS - 如何縮放和編碼/解碼base64所有jsons請求?

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}); 

哪裏和我如何告訴角放氣和編碼/解碼JSONs到base64之前的實際請求/響應接收?

我不知道我會包裝外部庫放氣和編碼/解碼到工廠。然後這個工廠會被注入到哪裏? Like $ httpBackend?

回答

6

你應該看看請求/響應變壓器$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檢查這個問題:How can you encode a string to Base64 in JavaScript?

+0

謝謝你的回覆。我很想做'$ httpProvider.defaults.transformRequest = function(request){return Base64Factory.encode(request)};'在我的myApp.config(function(){})中,但據我所知我在配置功能中不能注入工廠。你能不能更詳細地幫我解決這個問題?謝謝 –

+0

我也嘗試在myApp.run(function(){})中完成,但仍然沒有成功? –

+0

run()有什麼錯誤? –

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)}; 
}]); 
0

這是我如何做在過濾器。 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); 
    } 
}) 

嗯,我知道這並不確切地回答這個問題,但有一些小的調整,你可以得到你想要的東西(靶向未來的人同樣的問題)