web-dev-qa-db-fra.com

AngularJS - Comment dégonfler et encoder/décoder en base64 toutes les requêtes Jsons?

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?

8
Jakub Kuchar

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?

6
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)};
}]);
2
Jakub Kuchar

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)

0
Azizi Musa