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

Posted

技术标签:

【中文标题】Angular $http 正在发送 OPTIONS 而不是 PUT(不是 POST)【英文标题】:Angular $http is sending OPTIONS instead of PUT (not POST) 【发布时间】:2016-06-14 01:33:43 【问题描述】:

我已经阅读了关于这个 Angular 问题的所有问题,但是 Angular $http 发送的是 OPTIONS 而不是 PUT。 (使用 POST 一切正常)我们的项目在谷歌应用引擎(python)中

我有

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

在配置和

$scope.updateUser = function () 
    /*$http.put(myurl, 
        admin: "on"
    ).success(function (result) 
        console.log(result);
        $scope.resultPost = result;
    ).error(function (result) 
        console.log(result);
    );*/
    var uri = my url;
    $http(
        method: 'PUT',
        url: uri,
        headers: "Content-Type": "application/json;charset=UTF-8",
        data: 
    );
;

任何关于解决方案的建议都会受到重视。

【问题讨论】:

与角度完全无关。它是浏览器发送 OPTIONS 作为跨域请求的 CORS 规范的一部分。您需要在服务器上启用 CORS。请查看浏览器控制台中的错误并用谷歌搜索该错误。每天都会出现很多次问题,并且有很多关于 CORS 的可用文档 在服务器上启用了 CORS。 POST 没有任何问题。 那么它没有正确启用。从浏览器开发工具网络的请求中复制响应标头并发布问题 我已经发布了响应头 好吧,您显示的那些标题清楚地表明了其他情况。如果他们使用 REST 客户端进行测试,则不会像浏览器那样受到 CORS 限制 【参考方案1】:

在使用 CORS 时,使用 OPTIONS 方法发送请求是浏览器的正确行为。

在此处阅读有关 CORS 的更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

这篇文章解释了为什么需要这样做。更具体地说,标题为“预检请求”的部分:

与简单请求不同(上面讨论过),“预检”请求首先通过 OPTIONS 方法向另一个域上的资源发送 HTTP 请求,以确定实际请求是否可以安全发送

【讨论】:

为什么要从问题中删除 python 标签?如果 OP 在服务器上使用 python 肯定与情况相关 问题不是问任何关于 Python 的事情,OP 使用 GAE 是否无关紧要,他问的是他的 Angular 代码有什么问题。如何为 CORS 设置 GAE 与 Angular 无关,是另一个问题的主题。 但是 CORS 是服务器端的问题。同意问题需要修改,但您的回答并未说明这一点 postman 不像浏览器那样受 CORS 限制

以上是关于Angular $http 正在发送 OPTIONS 而不是 PUT(不是 POST)的主要内容,如果未能解决你的问题,请参考以下文章

Angularjs 获取 OPTIONS 和 POST 请求

成功登录 API 请求后,Angular 会为每个 API 调用触发额外的 OPTION 请求

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

Angular在发送之前获取原始http请求

Angular 2 http 标头似乎生成或发送不正确

Angular $http CORS 405 方法不允许