2013-06-08 2 views
15

$ httpProvider.interceptors를 실제로 가로 챌 수없는 것처럼 보입니다. 인터셉터가 실행될 때와 $ http 응답이 성공적 일 때 기록하는 JSFiddle 샘플을 작성했습니다. 요청 인터셉터는 응답이 이미 성공적으로 반환 된 후에 실행됩니다. 이것은 약간 뒤로 보인다.

config에서 params를 변경해야하므로 transformRequest를 사용할 수 없습니다. 그 부분은 샘플에 표시되지 않습니다. 데이터가 반환 된 후

내가 사용 AngularJS와 1.1.5

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

자바 스크립트

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 서비스를 사용하도록 코드를 변경하면 인터셉터가 먼저 실행되는 것을 볼 수 있습니다. , 당신의 코멘트를 읽어 보지 않았

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

편집 참 responseInterceptors을 : 수락/할 수있는 옵션을 원하는 경우

+3

와우 ... 지금 바보 같아. 그래도 고마워! 다른 코드에서 $ httpProvider.interceptors 대신 deprecated $ httpProvider.responseInterceptors를 사용하고있는 것으로 나타났습니다. – skeemer

18

은 아래 예 참조, $ httpProvider.responseInterceptors을 사용해야 차단시 요청을 거부 현재 사용되고있는 그 대신 그것을 할 방법은 다음과 같습니다

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

내가 유용하게 뭔가를 배운 덕분에

관련 문제