Disons que j'ai plusieurs ressources $ et quelques $ http autour de mon application angulaire:
myApp.factory('Note', function($resource) {
return $resource('http://', {id: '@id'},
{ 'index': { method: 'GET', isArray: true },
'update': { method: 'PUT'},
});
});
avec contrôleur
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!"
});
});
et certaines demandes sont faites par $ http directement comme authentification
var request = $http.post('http://', {email: email, password: password});
Où et comment je peux dire à angular de dégonfler et d’encoder/décoder les JSON en base64 avant que la demande réelle soit faite/que la réponse soit reçue?
Je pense que je vais emballer les librairies externes pour déflater et encoder/décoder en usine. Et puis cette usine sera injectée quelque part? Vous aimez $ httpBackend?
Vous devriez jeter un oeil sur les transformateurs demande/réponse pour le service $http
: http://docs.angularjs.org/api/ng.$http
Les transformateurs de requête/réponse sont simplement des fonctions qui peuvent être appelées avant que le contenu ne soit envoyé/rendu à l'appelant. Vous pouvez spécifier des fonctions de transformation globalement (pour toutes les demandes/réponses) ainsi que sur demande:
Pour remplacer ces transformations localement, spécifiez les fonctions de transformation En tant que propriétés transformRequest et/ou transformResponse de l'objet config . Pour remplacer globalement les transformations par défaut, substituez les propriétés $ HttpProvider.defaults.transformRequest et $ HttpProvider.defaults.transformResponse du $ HttpProvider.
Pour définir des transformateurs de requête/réponse globaux, vous devez écrire le code suivant ces lignes (il s'agit plus d'un pseudo-code, cela ne fonctionnera pas dans tous les navigateurs, voir les notes concernant Base64 ci-dessous):
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));
};
})
Bien sûr, votre code de transformation pourrait être plus sophistiqué et dépendre des en-têtes de requête/réponse, mais l’idée générale est la suivante. Le jsFiddle avec le code (vérifiez sur la console pour voir si une requête est transformée, vous devez utiliser Mozilla ou un navigateur WebKit): http://jsfiddle.net/Ydt5j/
Pour la conversion réelle de/en Base64, vérifiez cette question: Comment encoder une chaîne en Base64 en JavaScript?
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)};
}]);
voici comment je fais dans le filtre. item.htmlBody contient un texte encodé en base64 avec une balise 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);
}
})
eh bien, je sais que cela ne répond pas exactement à la question, mais avec quelques modifications mineures, vous pouvez obtenir ce que vous voulez (cibler une personne future avec le même problème)