繁体   English   中英

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

[英]Angular $http is sending OPTIONS instead of PUT/POST

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

我的设置如下:

我通过$ httpProvider设置标头:

 $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中的开发者控制台向我显示:

在此输入图像描述

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

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

在此输入图像描述

如何正确设置标题?


编辑:

PHP后端设置了一些标题:

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

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

有什么遗失的吗?

好的,我已经解决了。

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

在此输入图像描述

它的作用是:

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

重要信息: OPTIONS请求不会发送凭据

所以我的后端服务器不允许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"

在此之后, 在公用文件夹中创建一个名为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

我可以找到最好的网站来了解更多有关CORS的信息

您不需要手动指定$http标头,这些都是在幕后完成的,它们会自动设置为application/json用于POSTPUT类型请求。 所以你应该做的就是

$http.post(url, data);
$http.put(url, data);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM