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
请注意,请求应该在哪里发送一个值为world
的hello
标头,但实际上不是:
我在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 $http 正在发送 OPTIONS 而不是 PUT(不是 POST)
Angular:HTTP GET 请求 - OPTIONS 405(不允许的方法)
Angular $http 正在发送 OPTIONS 而不是 PUT/POST