Angular HTTP 拦截器中的 HTTP
Angular HTTP within a HTTP Interceptor
我需要将必要的 HMAC headers 附加到请求中。这应该不是很困难,但是我开始感到沮丧。以下代码有什么问题。我正在执行的实际 http 调用有效;我有 运行 这个电话,它 returns 必要的数据。它在拦截器内部不起作用。
我只想让当前的实现工作,然后再为此拦截器添加白名单或黑名单以及其他可自定义的数据。然而,这不是关于 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' 的实现不同这一事实有关?
看起来你实际上并没有用新获得的 HMAC 修改 config
。
此外,您需要防止 requestInterceptor
拦截获取 HMAC 的调用,从而导致无限循环。
最后,您在这里不需要 deferred
- 只需 return $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 headers 附加到请求中。这应该不是很困难,但是我开始感到沮丧。以下代码有什么问题。我正在执行的实际 http 调用有效;我有 运行 这个电话,它 returns 必要的数据。它在拦截器内部不起作用。
我只想让当前的实现工作,然后再为此拦截器添加白名单或黑名单以及其他可自定义的数据。然而,这不是关于 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' 的实现不同这一事实有关?
看起来你实际上并没有用新获得的 HMAC 修改 config
。
此外,您需要防止 requestInterceptor
拦截获取 HMAC 的调用,从而导致无限循环。
最后,您在这里不需要 deferred
- 只需 return $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
};