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

标签 javascript json angularjs

我正在尝试通过 PHP 后端在 MySQL 数据库中更新/插入数据。我正在使用 AngularJS 构建前端,并使用 $http 服务与 REST API 进行通信。

我的设置如下所示:

我正在通过 $httpProvider 设置 header :

 $httpProvider.defaults.withCredentials = true;
 $httpProvider.defaults.headers = {'Content-Type': 'application/json;charset=utf-8'};

POST-Call 看起来像这样:

   return $http({
      url: url,
      method: "POST",
      data: campaign
    });

Chrome 中的开发控制台向我展示了这一点:

enter image description here

当我从 POST 更改为 PUT 时,我发送的是 OPTIONS 调用而不是 PUT。并且内容类型只切换到 content-type

我的请求负载作为对象发送:

enter image description here

How do I set my header properly?


编辑:

PHP 后端设置了一些 header :

   $e->getResponse()
              ->getHeaders()
              ->addHeaderLine('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');

   $e->getResponse()
              ->getHeaders()
              ->addHeaderLine('Access-Control-Allow-Origin', '*');

Is there something missing?

最佳答案

好的,我已经解决了。

出了什么问题?
DELETE、PUT 和 POST 的 CORS 工作流程如下:

enter image description here

它的作用是:

  1. 检查将发出哪个请求
  2. 如果是 POST、PUT 或 DELETE
  3. 它首先发送一个 OPTION 请求以检查发送请求的域是否与来自服务器的域相同。
  4. 如果没有,它希望允许一个 Access-Header 发送这个请求

Important here: An OPTIONS request doesn't send credentials.

所以我的后端服务器不允许 PUT 请求。

解决方案:
把它放在 .htaccess 文件中

RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ blank.php [QSA,L]
Header set Access-Control-Allow-Origin "http://sub.domain:3000"
Header always set Access-Control-Allow-Credentials "true"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"

之后,在公共(public)文件夹中创建一个名为 blank.php 的空 .php 文件。

编辑:正如一位评论者指出的那样,您可以将此重写规则添加到您的 .htaccess 文件中,而不是创建一个空的 PHP 文件\;

RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]

澄清一下:

  1. 我已经发送了 Access-Control-Header
  2. 它解决的是前两行,并且
  3. 来自具有端口的特定子域的 Access-Control-Allow-Origin

我能找到的最佳网站 learn more about CORS .

关于javascript - Angular $http 正在发送 OPTIONS 而不是 PUT/POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30254277/

相关文章:

JavaScript Array[1] 获取内容

android - REST API 设计,使用哪种模式

angularjs - 如何在angularjs中选择表格中的单个项目

angularjs - 密码重置后,Firebase 身份验证不会更新

javascript - 在javascript中获取矩阵的所有可能选项

javascript - 检测脚本是否已经加载

javascript - $resource Angular 返回未定义的 $promise

javascript - 使用 Ajax jQuery 实时搜索 JSON 数据不起作用?

jquery - 使用 jquery 解析单行 json

angularjs - 在 AngularJS 中使用 ng-repeat 过滤结果 6 到 10(共 100 个)