可以't使用Angular.js$http设置或覆盖特定标头
Can't set or override on specific header using Angular.js $http
我使用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
有什么办法吗
- 我可以添加无法使用"headers"对象添加的标头吗
- 我可以删除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的禁止标头名称
- 将谷歌地图中的平移边界设置为图像覆盖
- jQuery插件在默认设置中覆盖url
- 设置自定义覆盖和多边形的任意z索引顺序
- 如何覆盖羽灯中的默认设置
- 流星铁路由器设置覆盖路线
- 设置 jQuery 滑块的默认值,并在需要时覆盖
- Extjs 4.1.1 覆盖了数字字段的设置值,抛出未捕获的错误
- 在Javascript中,b总是会覆盖a设置(a || b)
- 如何在javascript中覆盖navigator.plugins或如何将其设置为空
- 如何覆盖 JCuQuery/JavaScript 设置的 CSS 高度
- B扩展A:在B中设置将覆盖get
- 可以't使用Angular.js$http设置或覆盖特定标头
- 设置/覆盖背景颜色时的jQuery/CSS优先级
- 设置要覆盖的HTML5视频元素
- 设置javascript变量的Ajax响应覆盖了任何html元素
- 当我需要将页边距底部设置为新值时,它将被覆盖
- 当尝试使用touchOverflowEnabled覆盖jQuery Mobile默认设置时,页面加载了两次
- 覆盖保留字(设置 false = true)
- 如何设置地图的缩放以覆盖所有可见的标记
- 花式盒子-设置宽度为不同的覆盖