JQuery Ajax发送GET而不是POST请求

100
以下代码会触发一个GET而不是POST的HTTP请求。
function AddToDatabase() {
  this.url = './api/add';
}

AddToDatabase.prototype.postData = function(dataToPost) {
$.ajax({
    type: "POST",
    url: this.url,
    data: dataToPost,
    context: this,
    success: this.onSuccess
  });
};


var AddToDatabase = new AddToDatabase();
data = {data: 'coucou'};
AddToDatabase.postData(data);

为什么我收到的是GET请求,如何获取POST请求?


我在Google Chrome Inspect和Firefox Inspect中看到浏览器发送了GET请求。这是来自Chrome的信息:

  

请求URL:http://localhost/SAMPLE-CODES/UPDATE%20MYSQL/api/add/   请求方法:GET状态代码:200 OK


已解决

调用'./api/add'的URL实际上是要进行'./api/add/index.php'的提交。结果发现调用'./api/add/index.php'或'./api/add/'会给我一个POST请求。

只是URL写错了,但由于某种原因我却得到了成功的GET请求'.api/add/'。


2
你为什么认为这将是一个GET请求? - Viktor S.
1
你是否尝试在 Firefox 上打开 Firebug 的网络面板并运行 Ajax 调用? - Fabrizio Calderan
2
Test - 如果你运行它并检查网络面板,你会发现它发送了一个POST请求。 - Viktor S.
1
请将解决方案添加为答案。 - Adam Lynch
1
感谢您发布解决方案 - 在URL中包含文件名,而不是依赖服务器重定向到index.php...正是这种微妙的差别让我的工作变得有趣...是的,我会选择“有趣”。 - cr0ck3t
显示剩余6条评论
13个回答

113

关于MVC的一些问题。由于某种原因,当我删除[HttPost]时,它按预期工作,即使我告诉ajax使用POST。

  • 结果是你需要使用

type: "POST"

  • 尽管jQuery页面上的示例说要使用

method : "POST"

现在它进行了POST请求

但是在查看文档后,我发现了这个:

enter image description here


7
这正是我刚遇到的问题。我没有意识到选项名称在1.9版本中已更改。之前一直以为它叫做“method”。 - Bill Garrison
2
我认为包含两者都没有问题,以确保安全。 { method : "POST", type: "POST" } - Scott
是的,你可以在构造函数中包含任何你想要的内容,但为了兼容性而同时包含这两个并没有太多意义。现在大多数人都会使用1.11或2.1。这只会在升级后(如从1.4.3或1.6.2)引起问题。 - Piotr Kula
3
我上周五花了很长时间来修复一个旧前端,让它使用全新的API。非常感谢你! - NobleUplift

35

我遇到了这个问题,根据@FAngle的建议,原因是我的.htaccess文件移除了尾部斜杠。我将url设置为/ajax/foo/bar/而不是/ajax/foo/bar。重定向导致请求从POST变成GET。去掉斜杠后,问题解决了!


这对我来说解决了原问题中提到的确切问题。我正在Wamp 3.0.6上托管一个Laravel应用程序。 - İlter Kağan Öcal
这个救了我的命,差点 debug 了将近 4 小时。 - Zul
解决了问题。 - jewelhuq

11

URL'./api/add'实际上被重定向到'./api/add/index.php',因此在重定向后发送的新请求具有奇怪的副作用,使用GET而不是POST

解决方案

  • 使用完整的URL'./api/add/index.php'
  • 或添加斜杠'./api/add/'

8

我发现当使用 dataType: 'jsonp' 时,请求会被转换成 GET。我将其改为 dataType: 'json' 后,请求从 GET 变为了 POST


你知道为什么会出现这种行为吗? - Saurabh Sarathe
1
@SaurabhSarathe — JSONP 的工作原理是生成脚本元素,这些元素只能生成 GET 请求。 - Quentin

7
我也注意到了这种情况,在我的POST请求中发生了GET行为。虽然情境很特殊,但或许对某些人有所帮助。
这种事情发生在我的用户角色编辑页面上,其中我在选中或取消选中的时候使用了ajax(post)作为立即动作。
我还将服务器配置为在用户角色信息更改时重新验证用户身份(并重定向),以便刷新他们的声明。
最终导致的恶性循环如下:
1. 首次角色更新 - POST - 成功200 2. 下一次角色更新 - POST - 302 Found -> 重定向 (我直到使用Fiddler而不是Chrome的网络监视器才注意到这一点) 3. 来自(2)的重定向调用(相同的URL)- GET - 404 Not Found (因为我只允许Post) 4. 转到(1)
我最终将服务器更改为在检测到ajax请求时(基于接受类型),绕过重新身份验证/声明更新。

哇!遇到了类似的问题。显然,在我的控制器层面上,它期望一个会话参数,但我在新的控制器端点中没有包含它,所以它进行了302,然后是GET。谢谢,伙计。 - Nimila Hiranya

3

我曾经遇到类似的问题,当我从我的url中删除硬编码的https://之后,它就开始正常工作了。

jQuery.ajax({
 type: "POST",
 url: "www.someurl.com",//instead of "https://www.someurl.com"
 data: { foo:"bar"},
 success: function(d){ console.log(d); },
 dataType: "JSONP"
});

这听起来更像是HTTP和HTTPS之间的问题(例如,您的www.someurl.com没有有效证书) - Alexis Wilke

2

我曾经遇到同样的问题,找到了这个问题,但是答案并没有解决我的问题。最终,我通过在ajax请求中删除contentType字段来解决它。

contentType: "application/json",

2

对我来说,你的代码看起来没问题,但如果你想确保,你可以使用$.post而不是$.ajax

$.post('ajax/test.html', function(data) {
 $('.result').html(data);
});

jQuery链接:http://api.jquery.com/jQuery.post/


8
post 只是一个 $ajax({type:'POST'}) 的简写方式。 - Viktor S.
是的,但是你的代码看起来很不错。当我测试它时,它会执行一些POST请求。 - Mr_DeLeTeD

2

请检查您的 .htaccess 文件或搜索其他可能会重定向您请求的内容


1

一个非常常见的错误是我们使用按钮类型作为提交,但没有更改表单的方法(默认为get)

确保不要使用按钮类型submit,如果你使用了,你需要将表单方法更改为post


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