Angular $ http发送OPTIONS而不是PUT / POST
我正在尝试通过PHP后端更新/插入MySQL数据库中的数据。 我正在用AngularJS构build前端,并使用$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。 内容types切换到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工作stream程如下:
它所做的是:
- 检查哪个请求将被做
- 如果是POST,PUT或DELETE
- 它首先发送一个OPTION请求,以检查发送请求的域是否与服务器的域相同。
- 如果不是 ,它希望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"
之后,在公用文件夹内创build一个名为blank.php的空的.php文件。
编辑:正如一位评论者指出,而不是创build一个空的PHP文件,你可以添加这个重写规则到你的.htaccess文件\;
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]
澄清:
- 我已经发送了Access-Control-Header
- 它解决的是前两行,而且
- Access-Control-Allow-Origin来自具有Port的特定子域
我可以find最好的网站来了解更多关于CORS的信息 。
你不需要手动指定你的$http
头文件,这一切都是在幕后完成的,并且它们被自动设置为application/json
用于POST
和PUT
types的请求。 所以你应该做的就是
$http.post(url, data); $http.put(url, data);