【问题标题】:Angular HTTP within a HTTP InterceptorHTTP 拦截器中的 Angular HTTP
【发布时间】:2015-05-05 03:43:08
【问题描述】:

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

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

这个拦截器的错误在于整个承诺行从 $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' 的实现不同这一事实有关?

【问题讨论】:

  • 从请求requestInterceptor 调用的$http 会再次调用requestInterceptor 吗?我怀疑它会递归调用它
  • @pankajparkar,我几乎可以肯定它会......所以,为了避免无限循环,你应该只将拦截器应用于hmacApiEndpoint以外的网址。并且 $http 返回相同的承诺 + 和附加的 .success/.error - 所以,它是相同或兼容的

标签: javascript angularjs angular-promise angular-http-interceptors


【解决方案1】:

看起来您实际上并没有用新获得的 HMAC 修改 config

另外,您需要防止您的requestInterceptor 拦截调用以获取 HMAC,从而导致无限循环。

最后,这里不需要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
};

【讨论】:

  • 很好的解决方案,但你能解释一下如何不会为你正在为HMAC 调用$http.get 的拦截器
  • @pankajparkar,它会被调用,但会跳过内部的 $http 调用以(再次)获取 HMAC
  • @pankajparkar,怎么会这样? {cache: true} 设置将使它在没有 Ajax 请求的情况下检索先前的结果。也许我错过了什么?
  • 那是有道理的..很酷的解决方案..因为你每次都给..你很棒..:) +1 来自我
  • 太棒了!到底发生了什么。我从这个示例中删除了 hmac 标头,因为它们是任意的。无限循环是我忽略的。你是对的,http拦截器正在拦截自己的响应,因此永远不会解决。缓存 true 在非常幼稚的意义上只允许一次调用,但是原始调用被拦截,因此 cacheFactory 永远不会填充值。谢谢你的解决方案,你说的一切都很有道理,我忽略了那个递归循环。
猜你喜欢
  • 2023-03-13
  • 2017-11-07
  • 2018-05-19
  • 2018-07-08
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多