首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Angular $http正在发送选项,而不是PUT/POST

Angular $http正在发送选项,而不是PUT/POST
EN

Stack Overflow用户
提问于 2015-05-15 15:48:45
回答 2查看 49.7K关注 0票数 62

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

我的设置如下所示:

我正在通过$httpProvider:设置标头

代码语言:javascript
复制
 $httpProvider.defaults.withCredentials = true;
 $httpProvider.defaults.headers = {'Content-Type': 'application/json;charset=utf-8'};

和POST调用如下所示:

代码语言:javascript
复制
   return $http({
      url: url,
      method: "POST",
      data: campaign
    });

Chrome中的开发人员控制台向我展示了以下内容:

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

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

如何正确设置报头?

编辑:

PHP后端设置了一些头部:

代码语言:javascript
复制
   $e->getResponse()
              ->getHeaders()
              ->addHeaderLine('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');

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

是不是少了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-19 22:36:53

好了,我已经解决了。

出了什么问题?

DELETE、PUT、POST的CORS工作流程如下:

它的作用是:

  1. 检查将发出哪个请求
  2. 如果是POST、PUT或
  3. ,它首先发送一个OPTION请求,检查发送请求的域是否与来自的域相同,它希望允许Access-Header发送此请求

这里很重要:OPTIONS请求不会发送凭证

所以我的后端服务器拒绝了PUT请求。

解决方案:

将此代码放入.htaccess文件中

代码语言:javascript
复制
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文件。

代码语言:javascript
复制
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]

要澄清的

我已经发送了Access-

  • -Header

  • ,它解决的是前两行,通过端口

从特定子域发送and

  • Access-Control-Allow-Origin

我能找到的最好的learn more about CORS网站。

票数 72
EN

Stack Overflow用户

发布于 2015-05-15 15:51:23

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

代码语言:javascript
复制
$http.post(url, data);
$http.put(url, data);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30254277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档