所以当我遇到这个问题时,我正在写一个应用程序。
这是PHP:Slimframework对应:
$app->delete('/products/:id',function($id) use($app){
$db = new mysqli('notsocoolhost','verycooluser','verycoolpassword','verycooldatabase');
$db->query("DELETE from products WHERE id='$id'");
});
我删除了确认您可以从数据库中删除它的部分。
这是Angular.JS:
$scope.del = function(product){
$http({
method: "DELETE",
url: baseUrl + product.id
}).success(function(){ ...... //Returns 0 -> WTF?
这个伙伴在这里返回错误状态:0
以下这个返回405:
$scope.delete(baseUrl + product.id).success ... //Returns 405 : Method Not Allowed
总结一下,我在Hurl.it上添加了几个测试,Slimframework的RESTApi完全正常运行。这留下了Angular.js的问题?我猜?
更新
经过进一步检查后,我发现了以下内容:
1)神秘地:请求方法(Firefox的字段)是OPTIONS。
2)访问控制请求方法:“删除”
3)Access-Control-Allow-Methods:“GET,POST,DELETE,PUT”
答案 0 :(得分:1)
我希望将来能为人们服务。
回到基础,在跨源请求中发送$ http请求时遇到问题与服务器和Angular.js无关。
如果您像我一样托管您的网络应用程序:
https:\\www.beautifuldomain.com
和您的API:
https:\\api.beautifuldomain.com
每当您尝试在Webapp和API之间执行请求时,您都在执行跨源请求。
这是什么意思?
这意味着您的消息将被视为跨源,并且它将被预检。
预检?
这意味着当您使用除GET,HEAD或POST之外的任何方法时。
如果用于发送Content-Type
以外的application/x-www-form-urlencoded, multipart/form-data, or text/plain, e.g.
它将以方法OPTIONS
发送。 - 这是预检的。
好的,我明白了,但我该怎么做?
现在很清楚,我们有两个选择继续前进:
第一个选项:
保留网络服务器结构,即:
www.example.com
- > Angular Web-App
api.example.com
- > API - 子域名
FOR POST: 并将transformRequest设置添加到$ httpProvider,如下所示:
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
(请记住预检,它确实允许我们发送x-www-form-urlencoded
。)
剩下的就是确保以x-www-form-urlencoded格式设置数据如下:
name=Andy&nickname=RainbowWarrior&....
FOR DELETE:
这个有点复杂,因为你必须做一些服务器端调整。
如果你像我一样使用Slimframework for PHP,你所要做的就是:
$response = $app->response();
$response->header('Access-Control-Allow-Origin', '*');
$app->options('/path/to/resource',function(){}); // This one just so you can accept OPTIONS it does nothing.
$app->delete('/path/to/resource',function()
{//your delete code is here
});
现在,只要您尝试从角度执行DELETE
,您就会在正在使用的w / e浏览器的XHR
标签上看到已发出OPTIONS
个请求{ {1}}。
第二个选项:
更不用说头痛了。
将您的API移动到同一个域,即
DELETE
- Webapp
www.example.com
- API
你受到上述所有保护。 这花了我7个小时的研究,我希望它可以帮助你们,节省你的时间!。