jQuery Ajax发送GET而不是POST


87

以下代码触发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);

为什么,如何获得POST?


我在Google Chrome Inspect和Firefox Inspect中看到浏览器发送了GET。来自Chrome:

请求网址: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,但是由于某种原因,我收到了对“ .api / add /”的成功GET请求。


2
您为什么认为这将是GET请求?
Viktor S.

1
您是否尝试过在Firebug上打开网络面板在firefox上运行ajax调用?
Fabrizio Calderan

2
测试-如果您要运行此程序并检查网络面板,则会发现它发送了发布请求
Viktor S.

1
@tucson-正如我已经写过的-检查您的.htaccess文件。可能它使重定向而不是重写。基本上,我看到JS可以(希望URL'./api/add'中的点使我感到困惑)。因此,它看起来更像是服务器端问题。而在你的问题的相关信息是不够的,给予具体的帮助
维克托·S.

1
请添加解决方案作为答案
Adam Lynch

Answers:


101

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

  • 原来你需要使用

类型:“ POST”

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

方法:“ POST”

现在开机自检了

但是在查阅文档后,我发现了这一点。

在此处输入图片说明


6
这就是我一直遇到的问题。没意识到选项名称更改为1.9。以为那总是“方法”
比尔·加里森

2
可以肯定地说,将两者都包括在内没有问题。 { method : "POST", type: "POST" }
斯科特,

是的,您可以在构造函数中包含所需的任何内容,但是为了兼容性而同时包含这两个对象并没有任何意义。现在大多数人将以任何方式使用1.11或2.1。这从1.4.3或1.6.2升级等之后只是导致一个问题
彼得·库拉

3
我花了很长时间尝试在星期五修复此问题,以更新旧的前端以使用全新的API。非常感谢!
NobleUplift

31

我遇到了这个问题,并且根据@FAngle的建议,这是因为我的.htaccess删除了斜杠-并且我已将URL设置为/ajax/foo/bar/而不是/ajax/foo/bar。重定向将请求从POST更改为GET。删除/,问题解决!


这为我解决了原始问题中提到的确切问题。我主办WAMP 3.0.6一个laravel应用
ILTER卡根OCAL

9

该网址'./api/add'实际上已重定向到'./api/add/index.php'。因此,这种奇怪的副作用是重定向后发送的新请求使用GET代替POST

  • 使用完整网址 './api/add/index.php'
  • 或添加一个斜线'./api/add/'

6

我在我的POST发送GET的地方也注意到了这种现象。该方案非常独特,但也许会对某人有所帮助。

这是发生在我身上我的用户角色编辑页面,在这里我使用AJAX(后)为立即采取行动,当一个角色被选中或取消选中的。

我还配置了服务器,以在用户角色信息更改时重新验证用户身份(并重定向用户),以便刷新其声明。

残酷的循环结束了:

  1. 首次角色更新-POST-成功200

  2. 下次角色更新-POST-找到302->重定向(直到使用Fiddler而不是Chrome的网络监视器后,我才注意到这一点)

  3. 从(2)重定向呼叫(相同URL)-GET-找不到404(因为我只允许发布)

  4. 转到(1)

我最终将服务器更改为在检测到ajax请求(基于“接受类型”)时绕过重新认证/声明更新。


非常感谢你!
machineaddict '18

哇!面对类似的事情。显然,在我的控制器级别,它期望的是会话参数,而我没有将其包含在新的控制器端点中,它正在执行302,然后执行GET。谢了哥们。
Nimila Hiranya

5

我发现使用dataType: 'jsonp'它会将请求转换为GET。我将dataType: 'json'其更改为从更改GETPOST


您为什么会观察到这种行为?
萨拉

@SaurabhSarathe — JSONP通过生成只能生成GET请求的脚本元素来工作。
昆汀

3

我遇到了类似的问题,当我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

对我来说,您的代码看起来不错,但是如果您想确定的话,可以使用$ .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.

是的,但是您的代码看起来不错。当我对其进行测试时,它会发出一些后期请求
Mr_DeLeTeD




0

一个非常常见的错误是我们使用按钮类型作为提交,而不更改表单的方法(默认情况下获取)

确保您不使用按钮类型提交,如果您已将表单方法更改为发布

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.