angularアプリケーションの周りにいくつかの$ 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});
実際にリクエストが行われる/レスポンスが受信される前に、JSONをdeflateしてbase64にエンコード/デコードするには、angularをどこにどのように伝えることができますか?
私はdeflateのために外部ライブラリをラップし、ファクトリーにエンコード/デコードします。そして、この工場はどこかに注入されますか? $ httpBackendのように?
$http
サービスのリクエスト/レスポンストランスフォーマーを確認する必要があります: http://docs.angularjs。 org/api/ng。$ http
要求/応答トランスフォーマーは、コンテンツが送信者に送信/返送される前に呼び出すことができる単純な関数です。変換関数をグローバルに(すべての要求/応答に対して)指定することも、要求ごとに指定することもできます。
これらの変換をローカルでオーバーライドするには、configオブジェクトの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にエンコードするにはどうすればよいですか?
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)};
}]);
これは私がフィルターで行う方法です。 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);
}
})
まあ、私はこれが質問に正確に答えていないことを知っていますが、いくつかのマイナーな調整で、あなたはあなたが望むものを得ることができます(同じ問題を持つ将来の人を対象としています)