Cross Origin $ http请求|资源

时间:2014-10-13 19:07:59

标签: php angularjs rest slim

所以当我遇到这个问题时,我正在写一个应用程序。

这是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”

1 个答案:

答案 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.

的请求数据,也会发送POST

它将以方法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个小时的研究,我希望它可以帮助你们,节省你的时间!。