我使用$http.defaults.headers.common
设置了几个默认标头,用于与我们的API进行通信 - 例如授权标头。这为在每个$http
请求或$resource
声明中指定这些标头节省了很多麻烦。
然而,在一个地方我正在对Foursquare API进行$http.get
调用,并且存在其他标头是一个问题a)显然我不想将授权标头发送给其他任何其他标头比我们的API和b)标头的存在迫使$http
使用CORS和Foursquare拒绝OPTIONS请求。
有什么办法可以在每台主机上设置默认值或使用其他一些上下文?我已经尝试将与Foursquare联系的指令移动到它自己的模块中,希望默认值可以被隔离,但它们不是。
我想我可以在Foursquare请求之前delete
$http.defaults
添加其他标头并在之后恢复它们但是感觉就像一个可怕的黑客攻击,如果尝试对我们的API发出任何请求,可能会出现问题等待Foursquare回复回来。
答案 0 :(得分:1)
您可以考虑做的是将服务创建为抽象层。在该服务中,您可以将url与受信任端点列表(您的api)进行比较,并仅在URL匹配时添加标头。
(function () {
'use strict';
var serviceId = 'webRequest';
angular.module('app').factory(serviceId, ['common', 'config', '$http', '$cookies', webRequest]);
function webRequest(common, config, $http, $cookies) {
var $q = common.$q;
var service = {
WebRequest: WebRequest
};
return service;
function WebRequest(method, url, data, okCallback, koCallback) {
//inspect url here and if it matches config.trustedEndpoint or something similar then...
var promise = $http({
method: method,
url: url,
data: data,
headers: { 'Authorization': $cookies.AuthCookie}
}).success(okCallback).error(koCallback);
//otherwise, make the call without the header.
return promise;
}
}
})();
其他方法是扩展ng-Resource并覆盖get的默认实现。
另一种方法可能是扩展ng-Resource并覆盖默认实现。
var module = angular.module('customResource', ['ngResource']);
module.factory( 'Resource', [ '$resource', function( $resource ) {
return function( url, params, methods ) {
var defaults = {
get: { method: 'get' }
};
methods = angular.extend( defaults, methods );
var resource = $resource( url, params, methods );
resource.prototype.$get = function() {
//inspect url of this here and add header if needed
};
return resource;
};
}]);
答案 1 :(得分:0)
我找到了解决此问题的好方法,而无需使用$http.defaults
。
相反,我按照Angular docs中的描述注册拦截器。在其中,我可以随意修改请求配置:
request: (config) ->
if config.url.indexOf('http://myhost.com') is 0
if $cookies.AuthToken? and not config.headers['Authorization']?
config.headers['Authorization'] = "Token #{$cookies.AuthToken}"
config
```