我在角度和laravel中构建一个API服务,当我向API发送GET调用时,Everythings工作正常,但是当我触发POST调用时,服务仍然使用GET方法而不是POST。 那是我的服务:
function LeadsAPI($http,$q,BASE_URL)
{
this.updateLead = function (lead_data) {
var url = BASE_URL+"/leads/update/";
var deferred = $q.defer();
$http.post(url , lead_data).then(function(response){
deferred.resolve(response.data);
});
return deferred.promise;
}
}
我从控制器调用此函数:
LeadsController.$inject = ['$scope', 'LeadsAPI'];
function LeadsController($scope , LeadsAPI)
{
LeadsAPI.updateLead({'lead_id' : res._id, 'the_lead': {'fist_name' : 'asd asd'}}).then(function (res) {
console.log(res);
});
}
我尝试将参数作为字符串传递(" a = b& c = d ...")并添加标题:
$http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
在我的App模块实例化的run
函数中但是,我一直收到405 (Method Not Allowed)
错误。
任何想法为什么以及如何解决它?非常感谢你们! :)
答案 0 :(得分:7)
似乎这个问题很老而且没有答案,但Google引导我到这里来。我希望有人会觉得这个答案很有用。
我遇到了同样的问题。 $ http设置为POST但服务器从GET请求返回错误。
检查Web检查器中的标题后,它显示浏览器实际上发出了两个请求:
update/ 301 text/html angular.js:11442
update 405 xhr https://test.site/post/update
第一个是$ http中的一个,第二个是重定向后的。 如您所见,尾随斜杠URL被重定向到非尾随URL。通过此重定向,POST请求也会更改为GET。
解决方案是将您的请求网址更改为不包含尾部斜杠:
url: BASE_URL+"/leads/update",
答案 1 :(得分:0)
GET工作得很好......很好 POST返回405 - 不允许方法 听起来它正在进行POST,而您发布的服务器不支持对有问题的端点的POST请求
是否可以提供更多信息,例如发出GET请求时的HTTP请求和响应标头以及POST请求的相同信息
您可以通过Firefox的Firebug或Chrome控制台中的NET标签访问标题信息
答案 2 :(得分:0)
确保您的API方法已准备好处理POST请求。也许Angular实际上是在发出一个POST请求,但你的方法是期待一个GET。
如果您确定Angular由于某种原因确实正在触发GET请求而不是POST,请尝试在$ http对象上显式设置HTTP方法:
$http({
method: 'POST',
url: BASE_URL+"/leads/update/",
data: lead_data
}).then(function (response) {
deferred.resolve(response.data);
});