3

必要な HMAC ヘッダーをリクエストに追加する必要があります。これはそれほど難しいことではありませんが、イライラし始めています。次のコードの何が問題になっていますか。私が行っている実際のhttp呼び出しは機能します。この呼び出しを自分で実行したところ、必要なデータが返されました。インターセプター内では機能しません。

このインターセプターにホワイトリストまたはブラックリスト、およびその他のカスタマイズ可能なデータを追加する前に、現在の実装を機能させたいだけです。これは hmac に関する質問ではありませんが、約束があります。

このインターセプターのエラーは、$http(...) で始まるプロミス行全体にあります。このブロックを削除してそのまま使用すると(約束の実行を除く)、正常に動作します。行のコメントを外すとすぐに、ループに陥ってクロムがクラッシュします。私が読んだどこでも、これがその方法であると書かれていますが、これは明らかに機能しません。

function requestInterceptor(config){
  var $http = $injector.get('$http');
  var deferred = $q.defer();

  $http.get(hmacApiEndpoint, {cache: true}).then(function(data){
    console.log('HMAC - Success', data)
    deferred.resolve(config)
  }, function(config){
    console.log('HMAC - Error', config)
    deferred.resolve(config)
  })

  return deferred.promise;
}

return {
  request: requestInterceptor
};

これは、angulars $http promise が「$q」の実装とは異なる実装であるという事実と関係がありますか?

4

1 に答える 1

6

config新しく取得した HMAC で実際に を修正しているようには見えません。

requestInterceptorまた、 HMAC を取得するために呼び出しを傍受しないように保護する必要があるため、無限ループが発生します。

そして最後に、ここでは必要ありません- (or )deferredによって生成された promise を返すだけです:$http$http.then()

function requestInterceptor(config){
  var $http = $injector.get('$http');

  // just return, if this is a call to get HMAC
  if (config.url === hmacApiEndpoint) return config;

  return $http.get(hmacApiEndpoint, {cache: true})
    .then(function(response){
      console.log('HMAC - Success', response.data)

      // not sure where the HMAC needs to go
      config.headers.Authorization = response.data;
      return config;
    })
    .catch(function(){
       return $q.reject("failed to obtain HMAC");
    });
}

return {
  request: requestInterceptor
};
于 2015-05-04T19:33:34.260 に答える