2014-08-27 7 views
4

서버로부터 401 "인증되지 않은"응답이 반환 될 때마다 로그인 대화 상자를 표시하기 위해 angular-http-auth을 사용하고 있습니다.

멋지 기 때문에 내 서비스에서 응답 개체를 deserialize하려고합니다. 예를 들어 서비스에서 car을 요청하고 응답이 {make: Honda, model: Civic} 인 경우 transformResponse을 사용하여 Car 개체로 역 직렬화를 시도합니다. 예를 들어

:

getCar: function() { 
    return $http.get('/api/car', { 
     method: 'GET', 
     transformResponse: function(data, headers) { 
      var c = angular.fromJson(data); 
      return new Car(c); 
     } 
    }); 
} 

이것은 angular-http-auth 작동하지 않습니다. 401 Unauthorized 응답 인 경우 자바 스크립트 오류가 발생합니다. 각도는 응답이가 401

그것은 (어떤 angular-http-auth 용도이다) $http 인터셉터가 transformResponse 코드 후에 실행되는 것으로 나타났다 경우에도 그 transformResponse 코드를 실행하려고합니다 때문이다. 서버 응답이 401 일 경우 transformResponse의 해당 코드가 작동하지 않기 때문에 큰 문제입니다. data

이 문제는 다른 사람에게도 문제가되지 않습니까? 어떻게 그 주위에 있었습니까? $http 인터셉터를 사용하는 경우 transformResponse을 사용하지 않습니까?

답변

3

는 파티에 늦게 알아,하지만 난 (I도 각도의 repo에 제기 related issue에 주석으로이 게시)처럼 구글에서 여기 오는 사람에게 :

나는 또한으로 발견 그 응답 인터셉터는 이후에transformResponse 메서드를 실행하는 것을 혼란스럽게합니다. 방법을 $http.defaults.transformResponse에 추가했습니다. Here은이를 수행하는 방법에 대한 문서의 예제입니다.당신은 기본적으로 실행 응답 요격을해야하는 경우

그래서, transformResponse 방법 전에이 그것을 수행해야합니다

'use strict'; 

angular.module('app') 
    .run(function ($http) { 
    $http.defaults.transformResponse.push(function (data, headers) { 
     // do stuff here before the response transformation 

     // Be sure to return `data` so that the next function in the queue can use it. 
     // Your services won't load otherwise! 
     return data; 
    }); 
    }); 

당신의 서비스 또는 HTTP 호출하는 경우 자신의 응답 변압기가없는 너 이제 좋아.

서비스에 자신의 transformResponse 메서드가있는 경우 실제로 모든 기본 변환기가 무시되고 (설명서를 오랫동안 읽은 후에 발견됨) 위 코드는 실행되지 않습니다.

이 문제를 해결하려면 this example 문서를 참조하십시오.

1

이 문제를 해결하기 위해 더 이상 transformResponse을 사용하지 않습니다. $ http 인터셉터보다 먼저 실행되면 transformResponse 지점을 볼 수 없습니다.

angular-http-auth을 사용하고 서비스의 응답을 deserialize하려면 서비스를 작성하여 HTTP 요청을 먼저 실행 한 다음 응답을 콜백 함수에서 역 직렬화하도록하십시오. 예를 들어

, 여기에 내가 OP의 예제를 재구성 한 것입니다 방법입니다 data가 배열 인 경우

Plunker

services.factory('HttpCarService', function($resource, $q) { 
    var resource = $resource('/api/car'); 

    return { 

    getCar: function() { 

     var deferred = $q.defer(); 
     var car = null; 

     var successCallback = function(data, status, headers, config) { 
     var c = angular.fromJson(data); 
     car = new Car(c); 
     deferred.resolve(car); 
     }; 

     var errorCallback = function(data, status, headers, config) { 
     deferred.reject("something wrong"); 
     }; 

     var result = resource.get(successCallback, errorCallback); 
     return deferred.promise; 
    } 
    }; 

}); 

이 패턴은 또한 작동합니다.

$http 콜백 메소드가 실행되기 전에 인터셉터가 실행됩니다. $ resource에 url params가 필요한 경우 getCar() 함수가 config 객체를 매개 변수로 사용하도록 허용하고 $ resource.get() 호출을 할 때 필요한 정보를 전달할 수 있습니다.