在AngularJS上设置默认标头,但不要在一个特定请求上使用它

时间:2014-05-16 13:23:38

标签: angularjs http-headers request

要发送OAuth2令牌,我在AngularJS上设置默认值标头,如下所示:

$http.defaults.headers.common['Authorization'] = 'Bearer ' + access_token;

这很好但我不需要这个标题(我得到一个错误)来处理一个特定的请求。

有没有办法在执行该请求时排除默认标头?

谢谢!

解决

感谢Riron让我走上了正确的道路。这是答案:

$http({
    method: 'GET',
    url: 'http://.../',

    transformRequest: function(data, headersGetter) {
        var headers = headersGetter();

        delete headers['Authorization'];

        return headers;
    }
});

4 个答案:

答案 0 :(得分:19)

当您使用$ http拨打电话时,您可以直接在请求配置中覆盖默认值标头:

$http({method: 'GET', url: '/someUrl', headers: {'Authorization' : 'NewValue'} }).success();

否则,您可以使用transformRequest参数转换您的请求,仍然在$ http配置中。见doc:

  

transformRequest - {function(data,headersGetter)|Array.<function(data, headersGetter)>} - 转换   函数或这些函数的数组。转换函数需要   http请求正文和标题并返回其转换后的内容   (通常是序列化的)版本。

这样,您可以在发送之前删除单个请求的标头:

$http({method: 'GET', 
       url: '/someUrl', 
       transformRequest: function(data,headersGetter){ //Headers change here } 
}).success();

答案 1 :(得分:8)

对于后来者来说,虽然解决方案可能有效 - 但实际上你不应该为此使用transformRequest。

$ http服务的Angular文档实际上涵盖了这种情况:

  

显式删除自动添加的标头   每个请求的$ httpProvider.defaults.headers,使用标题   属性,将所需标题设置为未定义。   例如:

 var req = {  
      method: 'POST',  
      url: 'http://example.com',  
      headers: {  
           'Content-Type': undefined  
      },  
      data: { 
           test: 'test' 
      } 
 }

 $http(req).success(function(){...}).error(function(){...});

答案 2 :(得分:6)

Angular 1.4.0无法再使用transformRequest修改请求标头:

  

如果需要动态添加/删除标题,则应该完成   标题函数,例如:

$http.get(url, {
  headers: {
    'X-MY_HEADER': function(config) {
      return 'abcd'; //you've got access to a request config object to specify header value dynamically
    }
  }
})

答案 3 :(得分:0)

虽然$httpProvider可以覆盖$http,但使用intereceptors是处理此问题的一种方法,我最终会这样做

function getMyStuff(blah) {

        var req = {
            method: 'GET',
            url: 'http://...',
            headers: {
                'Authorization': undefined
            }
        }
        return $http(req)
            .then(function(response) {
                return response.data;
            });


}