3

我需要将必要的 HMAC 标头附加到请求中。这应该不是很困难,但是我开始感到沮丧。以下代码有什么问题。我正在做的实际http调用有效;我自己运行了这个调用,它返回了必要的数据。它在拦截器内部不起作用。

我只想让当前的实现工作,然后再为这个拦截器添加白名单或黑名单和其他可定制的数据。然而,这不是关于 hmac 的问题,而是关于承诺的问题。

这个拦截器的错误在于整个承诺行从 $http(...) 开始。当我删除此块并按原样使用它(减去承诺执行)时,它工作正常。一旦我取消注释该行,它就会陷入循环并崩溃 chrome。我读过的所有地方都说这就是它的完成方式,但这显然不起作用。

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产生的承诺:$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 回答