可以't使用Angular.js$http设置或覆盖特定标头

Can't set or override on specific header using Angular.js $http

本文关键字:覆盖 设置 http 使用 js Angular 可以      更新时间:2023-09-26

我使用Angular.js 1.4.8和Fiddler 4来调试我的请求。

以下是我使用AngularJS $http提出的请求。

var postRequest = {
    method: 'POST',
    url: 'https://speech.platform.bing.com/recognize',
    headers: {
        'Transfer-Encoding': 'chunked',
        Expect: '100-continue',
        Expect2: 'abc',
        Accept: 'application/json;text/xml',
        Host: 'region.platform.bing.com',
        'Content-Type': 'audio/wav; samplerate=8000',
        Authorization: 'auth-token',
        'Accept-Language': undefined,
        'Accept-Encoding': undefined,
        'User-Agent': undefined,
    },
    params: {
        scenarios: 'smd', // 'smd' in the internal sample code,
        locale: langString,
        'device.os': 'wp7',
        version: '3.0',
        format: 'json',
    },
    data: "test"
};
$http(postRequest).then(function (response) {
    console.log(response)
});

但是,如下文所述,在实际请求中,缺少一些标头(例如,Expect、Transfer Encoding)。此外,即使在我将Angular设置为未定义(如官方文档中所述:https://code.angularjs.org/1.4.8/docs/api/ng/service/$http)。

岗位https://speech.platform.bing.com/recognize?device.os=wp7&format=json&locale=en-US&场景=smd&版本=3.0 HTTP/1.1

预期2:abc

接受:application/json;text/xml

内容类型:音频/wav;采样率=8000

授权:"auth token"

**接受语言:en-US,en;q=0.8,ko;q=0.6,zh-Hans-CN;q=0.4,zh-Hans;q=0.2

接受编码:gzip,deflate**

用户代理:Mozilla/5.0(Windows NT 10.0;WOW64;MSAppHost/3.0)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/42.2311.35 Safari/537.36 Edge/12.120240

主持人:演讲平台.bing.com

内容长度:271491连接:保持活动缓存控制:无缓存

Cookie:MUIDB=39DE0AD21AD46AF2039D02BB1BB26B61

有什么办法吗

  1. 我可以添加无法使用"headers"对象添加的标头吗
  2. 我可以删除Angular自动添加的标题吗

或者是Angular错误?

可以。您可以使用角度拦截器全局处理它。因此,对于每个请求,您可以自动删除不需要的标头并添加必要的标头。

$httpProvider.interceptors.push(['$q', '$location', 'localStorageService', function ($q, $location, localStorageService) {
            return {
                request: function (config) {
                    config.headers = config.headers || {};
                    var authData = localStorageService.get('authData');
                    if (authData) {
                        config.headers.Authorization = 'Bearer ' + authData.token;
                    }
                    return config;
                },
                response: function (result) {
                    return result;
                },
                responseError: function (rejection) {
                    console.log('Failed with', rejection.status, 'status');
                    if (rejection.status == 401) {
                        localStorageService.remove('authData');
                        window.location.replace(window.location.origin)
                    }
                    if (rejection.status == 307) {
                        $location.url('/SessionExpired');
                    }
                    if (rejection.status == 403) {
                        $location.url('/Forbidden');
                    }
                    if (rejection.status == 500) {
                        $location.url('/InternalServerError');
                    }
                    return $q.reject(rejection);
                }
            }
        }])

设置HTTP标头

module.run(function($http) {
  $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w';
});

小心,其他答案可能会误导。。。是的,使用建议的策略,您可以覆盖一些标头,但不能覆盖所有标头。。。原因是,根据规范,一些标头是保留的,并且将仅由浏览器控制。。。这些保留标头的示例有:

  • 接受字符集
  • 接受编码
  • 访问控制请求标头
  • 访问控制请求方法

你可以在以下网址中找到更多关于这方面的信息:

  • AngularJS:拒绝设置不安全的标头"访问控制请求标头"
  • 用于XMLHttpRequest的禁止标头名称