Angular $http 未在 OPTIONS 飞行前发送标头

Posted

技术标签:

【中文标题】Angular $http 未在 OPTIONS 飞行前发送标头【英文标题】:Angular $http not sending header in OPTIONS pre-flight 【发布时间】:2015-02-28 11:12:00 【问题描述】:

我正在尝试使用 $http 服务连接到 API,该服务需要为 POST 请求定义特定标头:

app.run(['$http', function($http) 
    $http.defaults.headers.post.hello = 'world';
]);

但是,我的 Angular 应用在​​ POST 之前发送了一个 OPTIONS 请求,并且它似乎没有发送自定义标头。

查看此 Plunker 中的网络选项卡:http://plnkr.co/edit/tcqIb2q9zIQb3nf2SzyT

请注意,请求应该在哪里发送一个值为worldhello 标头,但实际上不是:

我在access-control-request-header 中看到hello,但它不应该在自己的行上吗?为什么它不发送值world

【问题讨论】:

【参考方案1】:

添加header时,由于是跨域,请求首先通过OPTIONS方法向另一个域的资源发送HTTP请求,以确定实际请求是否安全发送。在此请求中,标头名称在 access-control-request-headers 中发送,以检查它是否是可安全发送的标头。

如果可以安全发送,则标头将与 POST 一起发送。

来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests

【讨论】:

那么标题不应该出现在OPTIONS 调用中吗? 不,它首先通过OPTIONS方法发送access-control-request-headers中的header名称,检查是否是安全的header发送。 感谢您的解释! 有一种特殊情况,OPTIONS 调用需要自定义标头。在 Azure 中运行基于标头的版本控制时,剥离 Api-Version 标头会导致 404 错误。没有版本头的资源路径不足以匹配资源。到目前为止,我还没有解决此问题的方法。 @nolexa 这个问题很久以前就发过了。我认为您应该能够在预检请求中修改developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… 以添加Api-Version 以便发送。

以上是关于Angular $http 未在 OPTIONS 飞行前发送标头的主要内容,如果未能解决你的问题,请参考以下文章

Angular JS $http 未在范围内定义

Angular $http 正在发送 OPTIONS 而不是 PUT(不是 POST)

Angular:HTTP GET 请求 - OPTIONS 405(不允许的方法)

Angular $http 正在发送 OPTIONS 而不是 PUT/POST

使用 OPTIONS 方法未使用 http 请求 Angular 6 发送授权标头

在 Angular 2 http.post 上添加任何选项或标题会发送 OPTIONS