禁用某些主机的$ http默认标头

时间:2013-11-15 14:35:08

标签: angularjs cors

我使用$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回复回来。

2 个答案:

答案 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

```