2013-06-08 13 views
15

$ httpProvider.interceptorsを実際に傍受するようには思えません。インターセプターが実行されたときと$ http応答が成功したときに記録するサンプルをJSFiddleで作成しました。リクエストインターセプタは、レスポンスがすでに成功して返された後に実行されます。これは少し後であるようです。

configのparamsを変更する必要があるため、私はtransformRequestを使用できません。その部分はサンプルには表示されません。データが返された後

私が使用しているAngularJS 1.1.5

http://jsfiddle.net/skeemer/K7DCN/1/

Javascriptを

var myApp = angular.module('myApp', []); 

myApp.factory('httpInterceptor', function ($q) { 
    return { 
     request: function (config) { 
      logIt('- Modify request'); 
      return config || $q.when(config); 
     } 
    }; 
}); 

myApp.config(function ($httpProvider) { 
    $httpProvider.interceptors.push('httpInterceptor'); 
}); 

function MyCtrl($scope, $http) { 
    // Hit a server that allows cross domain XHR 
    $http.get('http://server.cors-api.appspot.com/server?id=8057313&enable=true&status=200&credentials=false') 
    .success(function (data) { 
     //logIt(data[0].request.url); 
     logIt('- GET Successful'); 
    }); 

    $scope.name = 'Superhero'; 
} 


// Just the logging 
var logs = document.getElementById('logs'); 

function logIt(msg) { 
    var e = document.createElement('div'); 
    e.innerHTML = msg; 
    logs.insertBefore(e, logs.firstChild); 
} 

HTML

<div ng-controller="MyCtrl">Hello, {{name}}!</div> 
<br/> 
<div id="logs"></div> 

答えて

7

はリクエストインターセプタが実行されていません。それは前に走っています。 logIt関数は最新のメッセージを先頭に挿入します。 $ logサービスを使用するようにコードを変更すると、インターセプタが最初に実行されることがわかります。

+3

うわー...今や気分が悪い。ありがとう、しかし! 私の他のコードでは、$ httpProvider.interceptorsではなく廃止予定の$ httpProvider.responseInterceptorsを使用していました。 – skeemer

18

あなたは/あなたは$ httpProvider.responseInterceptorsを使用する必要があります傍受時に要求を拒否受け入れるためのオプションを使用する場合は、以下の例を参照してください。

$httpProvider.responseInterceptors.push(function($q) { 
    return function(promise){ 
     var deferred = $q.defer(); 
     promise.then(
      function(response){ deferred.reject("I suddenly decided I didn't like that response"); }, 
      function(error){ deferred.reject(error); } 
     ); 
     return deferred.promise; 
    }; 
}); 

EDIT確かresponseInterceptors、あなたのコメントを読んでいません廃止されましたANそれはあなたの代わりにそれを行う方法は次のとおりです。

$httpProvider.interceptors.push(function($q) { 
    return { 
     request: function(config){ return config; }, 
     response: function(response) { return $q.reject(response); } 
    }; 
}); 

は、私が何か役に立つことを学んだ、感謝

関連する問題