我正在尝试更新/插入数据在一个MySQL数据库通过PHP后端。我使用AngularJS构建前端,并使用$http
服务与REST API通信。
我的设置如下所示:
我正在通过$httpProvider:设置标头
$httpProvider.defaults.withCredentials = true;
$httpProvider.defaults.headers = {'Content-Type': 'application/json;charset=utf-8'};
和POST调用如下所示:
return $http({
url: url,
method: "POST",
data: campaign
});
Chrome中的开发人员控制台向我展示了以下内容:
当我从POST更改为PUT时,我发送的是期权调用而不是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', '*');
是不是少了什么?
发布于 2015-05-19 22:36:53
好了,我已经解决了。
出了什么问题?
DELETE、PUT、POST的CORS工作流程如下:
它的作用是:
这里很重要: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}]]
要澄清的:
我已经发送了Access-
从特定子域发送and
我能找到的最好的learn more about CORS网站。
发布于 2015-05-15 15:51:23
您不需要手动指定$http
标头,所有这些都是在幕后为您完成的,对于POST
和PUT
类型的请求,它们会自动设置为application/json
。所以你要做的就是
$http.post(url, data);
$http.put(url, data);
https://stackoverflow.com/questions/30254277
复制相似问题