94

以下代码触发 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 请求。

4

13 回答 13

107

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

  • 事实证明你需要使用

类型:“发布”

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

方法:“发布”

现在是 POST

但是在深入研究文档后,我发现了这一点。

在此处输入图像描述

于 2015-03-13T14:06:15.373 回答
35

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

于 2016-05-05T07:09:07.977 回答
11

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

解决方案

  • 使用完整的网址'./api/add/index.php'
  • 或添加斜线'./api/add/'
于 2016-10-17T11:19:23.087 回答
7

我在我的 POST 发送 GET 的地方也注意到了这种行为。这个场景非常独特,但也许它会对某人有所帮助。

这发生在我的用户角色编辑页面上,当角色被选中或取消选中时,我使用 ajax(发布)作为即时操作。

我还将服务器配置为在用户的角色信息发生更改时重新验证用户(并重定向他们),以便刷新他们的声明。

残酷的循环结束为:

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

  2. Next Role Update -- POST -- 302 Found -> Redirect (直到我使用 Fiddler 而不是 Chrome 的网络监视器,我才注意到这一点)

  3. 来自 (2) 的重定向呼叫(相同的 URL)- GET -- 404 Not Found(因为我只允许发布)

  4. 转到 (1)

当它检测到 ajax 请求(基于接受类型)时,我最终将服务器更改为绕过重新身份验证/声明更新。

于 2015-12-24T18:14:44.943 回答
6

我发现使用dataType: 'jsonp'它时会将请求转换为GET. 我把dataType: 'json'它改成了从GETPOST

于 2018-05-07T21:33:56.307 回答
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"
});
于 2016-05-03T20:31:38.377 回答
2

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

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

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

于 2012-08-30T11:33:54.613 回答
2

我遇到了同样的问题,发现了这个问题,但答案并没有解决我的问题。我最终通过删除contentTypeajax 请求中的字段来解决它。

contentType: "application/json",
于 2016-06-07T19:25:29.163 回答
1

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

于 2012-08-30T11:57:35.630 回答
1

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

确保你不使用按钮类型提交,如果你这样做了,你已经将表单方法更改为发布

于 2019-12-03T15:07:36.817 回答
1

我遇到了这个问题,结果证明是 IIS 中的 URL 重写模块。

我正在使用 ASP.NET MVC 和 WebAPI。我创建了强制小写 URL 的规则,因此社交网络不会将相同的 URL 视为两个不同的页面。

例如:

http://url.com/View/Something/123GuidIdSomething

对比

http://url.com/view/something/123guididsomething

然而,这在某种程度上弄乱了我的 ajax 请求。我禁用了规则,问题就解决了。

于 2016-07-28T19:22:39.707 回答
0

就我而言,事实证明问题不在 AJAX 请求中。

我已附加submit到按钮的type属性中input,因此,提交表单时,默认情况下它是对/路径的 GET 请求。

最终,我将type属性替换为button并且它起作用了。

$.ajax({
          url: "login.php",
          type: "POST",
          data: $("#form").serialize(),
          success: (param) => {},
          error: (param) => {} 
 })
<form id="form">
    <label for="foo">Foo</label>
    <input type="text" name="foo" id="foo">
    <br>
    <label for="password">Password</label>
    <input type="password" name="password" id="password">
    <br>
    <input <!--type="submit"--> type="button" value="Send" id="submit">
</form>

于 2022-01-19T14:04:01.257 回答
0

我遇到了这个问题,问题似乎与从输入中获取的 url 参数的编码有关。Chrome 的开发工具仍然显示POST请求,但值是作为GET请求接收的。

给出问题的代码是:

$.ajax({
    method: 'POST',
    type: 'POST',
    url: '/ajax/test.php?firstname=' + $('#fname').val()+ "&lastname=" + $('#lname').val()+ "&email=" + $('#email').val(),
    success: function(msg) {

        alert("Success");          
    },
    error: function() {

        alert("Failure");
    }
});

修复方法是移动 以使用data参数,而不是将值放入 url:

$.ajax({
    method: 'POST',
    type: 'POST',
    url: '/ajax/test.php',
    data: {firstname: $('#fname').val(), lastname: 
    $('#lname').val(), email: $('#email').val()},
    success: function(msg) {

        alert("Success");
                            
    },
    error: function() {
        alert("Failure");
    }
 });
于 2021-06-04T15:51:51.047 回答