【问题标题】:Ajax POST method not working in PHP, but GET is workingAjax POST 方法在 PHP 中不起作用,但 GET 起作用
【发布时间】:2016-06-13 09:43:47
【问题描述】:

我正在尝试使用 Ajax 向 php 发送 POST 请求。

如果我使用 GET 它可以正常工作,但是使用 POST 我在 php 中收到的数据是空的。 我以 json 格式发送数据。

这是js代码的样子:

$.ajax(
        {
            type: 'POST',
            url: 'php/GiveItBack.php',
            contentType: "json",
            data: {
                word: 'abc'
            },
            success: function (json) {
                alert(json);
            },
            error: function (jqXHR, textStatus, errorThrown) { alert('ERROR: ' + errorThrown); }
        });

这是 php/GiveItBack.php 文件

<?php

$x = $_GET['word'];
echo 'Get: ' . $x;

$x = $_POST['word'];
echo '; Post: ' . $x;

$x = $_REQUEST['word'];
echo '; Request: ' . $x . ';';

?>

使用此代码,警报窗口中的消息如下所示:

获取:;邮政: ;请求:;

如果我将 js 文件中的 type: 'POST' 替换为 type: 'GET' 这就是我在警报窗口中得到的结果(正如我所期望的那样看):

得到:abc;邮政: ;请求:abc;

我看不到我在这里缺少什么。 代码有问题还是我需要做任何特殊设置才能使其正常工作。

顺便说一句,我使用的是:jquery-2.2.4.min 和 php v5.6 和 XAMPP v3.2.2。

谢谢。

【问题讨论】:

  • 你检查过你的phpinfo吗? POST 激活了吗?
  • 这一行 ;enable_post_data_reading = Off 已注释且默认为开启。所以我猜它被激活了。
  • 尝试打印而不是回声,不太清楚为什么,但我过去使用回声时遇到过问题

标签: php jquery json ajax post


【解决方案1】:

内容类型不正确,需要使用contentType: "application/x-www-form-urlencoded" OR 'Content-Type': 'application/json'

   $.ajax(
    {
        type: 'POST',
        url: 'php/GiveItBack.php',
        contentType: "application/x-www-form-urlencoded",
        data: {
            word: 'abc'
        },
        success: function (json) {
            alert(json);
        },
        error: function (jqXHR, textStatus, errorThrown) { alert('ERROR: ' + errorThrown); }
    });

【讨论】:

  • 为什么?你能解释一下为什么需要为 POST 删除它吗?
  • 谢谢。这行得通。但是使用 contentType: "json" 有什么问题呢?
  • @Horatiu 因为json 不是有效的内容类型。这就像enctype 的形式。我希望 Dhara 真的会为你提供一个解释。我想你要的是dataType,它指定了返回数据的格式。
  • 设置 contentType: "application/x-www-form-urlencoded" ,只有 json 是无效的内容类型,对于 json - 使用 'Content-Type': 'application/json'
  • @DharaParmar 因此,将其添加到您的答案中,作为一个好的答案,您不应该只给出解决方案,而是解释 OP 做错了什么以及为什么错了,以便他们学习。
【解决方案2】:

contentType: "json",

您的内容类型在这里是错误的。如果您想以您尝试的方式接收它,您应该使用application/x-www-form-urlencoded

如果您仍想坚持使用 JSON,则必须 json_decode 您的 PHP 输入:

$json = file_get_contents('php://input');
$obj = json_decode($json, TRUE);

【讨论】:

    【解决方案3】:
    $.ajax(
        {
            method: 'POST',
            url: 'php/GiveItBack.php',
            data: {
                word: 'abc'
            },
            success: function (json) {
                alert(json);
            },
            error: function (jqXHR, textStatus, errorThrown) { alert('ERROR: ' + errorThrown); }
        });
    

    【讨论】:

    • type 是方法的别名... 那么为什么要这样工作呢?你能解释一下吗?
    • 我试图用方法替换类型...不起作用。尝试使用方法和类型,仍然无法正常工作。
    【解决方案4】:

    删除contentType: json,您应该可以使用$_POST 超级博客数组。如果您使用contentType: json,则包含参数的对象将转换为字符串并发送到服务器。要获取字符串,您需要使用

    file_get_contents('php://input');

    这是因为$_POST 仅包含与以下标头一起发送的数据:

    • application/x-www-form-urlencoded
    • multipart/form-data-encoded

    当您设置contentType: json 时,jQuery 会将application/json 标头添加到$_POST 不支持的请求中,因此JSON 字符串被视为原始输入,因此您需要使用php://input 流来检索它

    【讨论】:

      【解决方案5】:

      Ajax 数据 删除contentType: json:

      $.ajax(
              {
                  type: 'POST',
                  url: 'php/GiveItBack.php',
      
              data: {
                  word: 'abc'
              },
              success: function (json) {
                  alert(json);
              },
              error: function (jqXHR, textStatus, errorThrown) { alert('ERROR: ' + errorThrown); }
          });
      

      【讨论】:

      • 请查看此URL 这将有助于提高您的内容质量
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      相关资源
      最近更新 更多