AngularJS $http.post()触发get请求而不是post请求

3
我正在使用Angular和Laravel构建API服务,当我向API发送GET请求时一切正常,但当我发送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';

在我的应用程序模块实例化的run函数中,但我仍然收到405(方法不允许)错误。有什么想法如何解决它吗?非常感谢! :)

当你使用GET方法时,你说一切都正常工作。你说“post”方法正在执行GET方法。但是你得到了一个405错误。我漏掉了什么?GET方法是否有效? - Magus
抱歉,伙计,GET方法运行良好,但当我尝试使用POST方法时,它不起作用,仍将其作为GET请求发送,并从Laravel返回405错误。 - benjah
3个回答

9

似乎这个问题已经很旧且没有答案,但是我通过谷歌搜到了这里。我希望有人会发现这个答案有用。

我也遇到了同样的问题。$http被设置为POST,但服务器返回了GET请求错误。

在检查网络检查器中的标头后,显示浏览器实际上执行了两个请求:

update/ 301     text/html   angular.js:11442        
update  405     xhr         https://test.site/post/update

第一个是$http发出的请求,第二个是重定向之后的请求。 可以看到带有尾随斜线的URL被重定向为无斜线的URL。由于这个重定向,POST请求也会被改变为GET请求。 解决方法是将请求URL改为不包含尾随斜线的形式:
url: BASE_URL+"/leads/update",

0

GET请求正常工作...很好 POST返回405-方法不允许 看起来它正在进行POST操作,而您要发布到的服务器不支持对相关端点的POST请求

请提供更多信息,例如在进行GET请求时的HTTP请求和响应头以及进行POST请求时的相同信息

您可以通过Firefox的Firebug中的NET选项卡或Chrome控制台访问标头信息


0
  1. 确保您的API方法已准备好处理POST请求。也许Angular实际上正在触发一个POST请求,但是您的方法却期望一个GET请求。

  2. 如果您确定Angular由于某种原因实际上正在触发一个GET请求而不是POST请求,请尝试在$http对象上显式设置HTTP方法:

    $http({
       method: 'POST',
       url: BASE_URL+"/leads/update/",
       data: lead_data
    }).then(function (response) {
       deferred.resolve(response.data);
    });
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接