2014-11-04 127 views
1

这是我的第一个问题,所以不要让我处于危险之中。

我有一个API,我发送使用$资源的GET,POST,PUT,DELETE请求。我设法做了一个GET和一个POST请求来完成他们应该做的事情,但是每当我尝试发送一个PUT请求时,我都会得到一个404错误和一个OPTIONS方法。

基本上,我的PUT请求应该使用与POST相同的参数发送。当我通过Postman扩展发送看似相同的请求时,它工作正常。我只是不知道如何通过$ resource复制它。

plunker与问题:http://plnkr.co/edit/gJV4otD0XGKoQWOq3PdK(它更加清晰的plunkr比对了该粘贴一段代码)

services.js

angular.module('starter.services',['ngResource']).factory('RESTCalls', function ($resource) { 
return $resource('http://api.artistappz.com/api/v1/news/:urlkey/:id/x-app-id/3865f620590f40d493ec8d900b4c24d3/', null, { 
    update: { 
     method:'PUT' 
    }, 
    save: { 
     method:'POST', 
     headers:{ 
      'Content-Type':'application/x-www-form-urlencoded' 
     } 
    } 
}); 

});

controllers.js

angular.module('starter.controllers',[]).controller('HomeController', ['$scope','RESTCalls', function ($scope, RESTCalls) { 
$scope.RESTGet = function() { 
    RESTCalls.get(function (response) { 
     console.log(response); 
    }); 
}; 

$scope.RESTPost = function() { 
    RESTCalls.save('user_id=76A5FC91E4684FA1ACB2FDA645FD5B2C&title=dejan seme ti jebem krvavo&body=dejan&url=dejanurl',function(response) { 
     console.log('SUCCESS:'); 
     console.log(response); 
    },function (responseerr) { 
     console.log('ERROR:'); 
     console.log(responseerr); 
    }); 
}; 

$scope.RESTPut = function() {   
    ///item/84173EF7D6FD4469B411057C72F53DE2 
    RESTCalls.get({urlkey:'item',id:'84173EF7D6FD4469B411057C72F53DE2'},function (response) { 
     var tempobject = response.data.news['84173EF7D6FD4469B411057C72F53DE2']; 
     tempobject.user_id = '76A5FC91E4684FA1ACB2FDA645FD5B2C'; 

     RESTCalls.update({urlkey:'item',id:'84173EF7D6FD4469B411057C72F53DE2'},tempobject); 
    }); 
};}]); 

邮递员PUT请求http://i.stack.imgur.com/zLMUA.jpg

+0

:-) “ 'USER_ID = 76A5FC91E4684FA1ACB2FDA645FD5B2C&标题=德扬·塞梅TI jebem krvavo及身体=德扬&URL = dejanurl'” 啊哒...... Poznato ...:d – 2015-08-27 17:10:47

回答

1

这是关于 'HTTP访问控制'。因为您请求资源到不同的域服务器。您可以执行GET & POST请求,但“PUT”不同。

浏览器端会先发送'OPTIONS'请求。然后,在服务器“批准”之后,用实际的HTTP请求方法发送实际的请求。

如果您检查您的闯入者中的网络请求,您会注意到它是'OPTIONS'请求而不是'PUT'。

Here is MDN document for OPTIONS request.

Here is a relative issue.

+0

哦,亲爱的上帝谢谢你 – 2014-11-04 10:50:31

+0

我的喜悦) – 2014-11-04 11:16:00

1

要解决这个问题,你可以自定义你$resouce方法服务:

请看下面的例子:

服务:

angular.module('myApp') 
.factory('ProductService', ['$resource', 
    function ($resource) { 
     return $resource('/products', {}, { 
      query: { method: "GET", isArray: true }, 
      create: { method: "POST"}, 
      get: { method: "GET"}, 
      remove: { method: "DELETE"}, 
      update: { method: "PUT"} 
     }); 

    }]); 

控制器:

// Update a product with PUT method 
$scope.updateProduct = function() { 
    ProductService.update({id: 1234,color:blue}, function(data) { 
     // do something which you want with response 
    }); 
}; 

欲了解更多详情请参阅link