2012-12-30 22 views
8

Powiedzmy mam kilka zasobów dolarów i niektóre $ http wokół mojego kątowej aplikacji:AngularJS - Jak deflować i kodować/dekodować do base64 wszystkie żądania jsons?

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

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

ze sterownikiem

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

i trochę zamówienie wykonywane są przez $ http bezpośrednio jak uwierzytelnianie

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

Gdzie i jak mogę powiedzieć kątowo, aby opróżnić i zakodować/odkodować JSONy na base64 przed faktycznym wykonaniem żądania/otrzymaniem odpowiedzi?

I quess I owija biblioteki zewnętrzne dla deflate i kodować/dekodować do fabryki. A potem ta fabryka zostanie gdzieś wstrzyknięta? Podobnie jak $ httpBackend?

Odpowiedz

6

Trzeba spojrzeć na transformatorach żądanie/odpowiedź za usługę $http: http://docs.angularjs.org/api/ng.$http

żądanie/odpowiedź transformatory są po prostu funkcje, które mogą być wywoływane przed treści są wysyłane/oddał do rozmówcy. Można określić przekształcenie funkcji globalnie (dla wszystkich żądań/odpowiedzi), jak również podstawa per-żądanie:

Aby zastąpić te przemiany lokalnie określić przekształcić FUNKCJE jak transformRequest i/lub właściwości transformResponse z config obiektu. Aby globalnie zastąpić domyślne transformacje, należy zastąpić właściwości $ httpProvider.defaults.transformRequest i $ httpProvider.defaults.transformResponse dla $ httpProvider.

Aby zdefiniować transformatory globalne żądanie/odpowiedź można by napisać kod wzdłuż tych linii (to jest bardziej jak pseudo-kodu, nie działa we wszystkich przeglądarkach, patrz uwagi o Base64 poniżej):

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

}) 

Oczywiście twój kod transformujący może być bardziej wyrafinowany i zależy od nagłówków żądania/odpowiedzi, ale ogólny pomysł jest tutaj. JsFiddle z kodem (sprawdź konsolę, aby zobaczyć, że wniosek zostanie przekształcone, trzeba użyć Mozilli lub przeglądarki WebKit): http://jsfiddle.net/Ydt5j/

dla rzeczywistej konwersji z/do Base64 sprawdzić to pytanie: How can you encode a string to Base64 in JavaScript?

+0

dziękuję za odpowiedź. Chciałbym zrobić coś w rodzaju '$ httpProvider.defaults.transformRequest = function (request) {return Base64Factory.encode (request)};' in my mypp.config (function() {}), ale o ile wiem nie można wstrzyknąć fabrycznie funkcji konfiguracyjnej. Czy mógłbyś bardziej rozwlekle i mi w tym pomóc?Dziękuję –

+0

Próbowałem również wykonać w myApp.run (function() {}), ale nadal nie ma powodzenia? –

+0

Jaki błąd otrzymujesz przy użyciu funkcji 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

Tak robię w filtrze. item.htmlBody zawiera base64 zakodowany tekst z tagu html

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

//inside controller.js 

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

dobrze, wiem, że robi dokładnie odpowiedzieć na to pytanie, ale z niewielkimi dostrojenia, można dostać to, co chcesz (targetting przyszły osoby z tym samym problemem)