4

サーバーから 401 "unauthorized" 応答が返されるたびに、angular-http-authを使用してログイン ダイアログを表示しています。

私は冷静なので、サービス内の応答オブジェクトを逆シリアル化することも試みています。たとえば、サービスが をリクエストしcar、応答がである場合、を使用してそれをオブジェクト{make: Honda, model: Civic}に逆シリアル化しようとします。CartransformResponse

例えば:

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 の場合は、javascript エラーが発生します。transformResponseこれは、応答が 401 だった場合でも、angular がそのコードを実行しようとするためです。

$httpインターセプター ( angular-http-authが使用するもの) はtransformResponseコードの後に​​実行されることが判明しました。transformResponseサーバーの応答が 401 だった場合、そのコードは機能しないため、これは大きな問題ですdata( .

これは他の誰かにとって問題ですか?どうやってそれを回避しましたか?インターセプターを使用するtransformResponse場合は使用しないでください。$http

4

2 に答える 2

4

パーティーに遅れたことは知っていますが、私と同じように Google からここに来た人には ( Angular リポジトリに提出された関連する問題へのコメントとしてこれを投稿しました):

また、メソッドのに応答インターセプターが実行されることも混乱を招きました。transformResponseにメソッドを追加しました$http.defaults.transformResponse。これを行う方法に関するドキュメントの例を次に示します

したがって、基本的にメソッドのに実行される応答インターセプターが必要な場合は、次のようにします。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メソッドがある場合、それらは実際にはすべてのデフォルトのトランスフォーマーをオーバーライドし (ドキュメントを長く読んだ後にこれを見つけました)、上記のコードは実行されません。

これを回避するには、ドキュメントのこの例に従ってください。

于 2016-01-26T23:49:04.583 に答える