【问题标题】:Cannot pass null to server using jQuery AJAX. Value received at the server is the string "null"无法使用 jQuery AJAX 将 null 传递给服务器。服务器收到的值是字符串“null”
【发布时间】:2011-02-17 03:52:21
【问题描述】:

我正在转换一个 javascript/php/ajax 应用程序以使用 jQuery,以确保与 Firefox 以外的浏览器兼容。

我在使用 jQuery 的 ajax 函数传递 true、false 和 null 值时遇到问题。

Javascript 代码:

$.ajax
(
   {
      url     : <server_url>,
      dataType: 'json',
      type    : 'POST',
      success : receiveAjaxMessage,
      data:
      {
         valueTrue : true,
         valueFalse: false,
         valueNull : null
      }
   }
);

PHP 代码:

var_dump($_POST);

服务器输出:

array(3) {
  ["valueTrue"]=>
  string(4) "true"
  ["valueFalse"]=>
  string(5) "false"
  ["valueNull"]=>
  string(4) "null"
}

问题在于 null、true 和 false 值正在转换为字符串。

当前使用的 Javascript AJAX 代码正确传递 null、true 和 false,但仅适用于 Firefox。

有谁知道如何使用 jQuery 解决这个问题?


这里有一些工作代码(不使用 jQuery)与上面给出的不工作代码进行比较。

Javascript 代码:

ajaxPort.send
(
   <server_url>,
   {
      valueTrue : true,
      valueFalse: false,
      valueNull : null
   }
);

PHP 代码:

var_dump(json_decode(file_get_contents('php://input'), true));

服务器输出:

array(3) {
  ["valueTrue"]=>
  bool(true)
  ["valueFalse"]=>
  bool(false)
  ["valueNull"]=>
  NULL
}

请注意,正确接收 null、true 和 false 值。

另请注意,在第二种方法中,PHP 代码中没有使用 $_POST 数组。我认为这是问题的关键,但我找不到使用 jQuery 复制这种行为的方法。


此部分是在以下答案被接受后添加的。

这是原始代码的更正版本。

Javascript 代码:

$.ajax
(
   {
      url     : <server_url>,
      dataType: 'json',
      type    : 'POST',
      success : receiveAjaxMessage,
      data    : JSON.stringify
      (
         {
            valueTrue : true,
            valueFalse: false,
            valueNull : null
         }
      )
   }
);

PHP 代码:

var_dump(json_decode(file_get_contents('php://input'), true));

服务器输出:

array(3) {
  ["valueTrue"]=>
  bool(true)
  ["valueFalse"]=>
  bool(false)
  ["valueNull"]=>
  NULL
}

【问题讨论】:

  • 我可能错了,但您的数据是有效的 JSON 格式吗?不应该将所有键/值都包含在 "" 中吗?它可能无法解决您的问题,但是如果您对数据进行字符串化并且只为空值传递一个空字符串,那么我认为它可能会起作用吗?我有一种感觉 jquery 正在将您的数据包装在“”中,因此您发送到服务器的值实际上是一个包含文本 null 的字符串,例如:“null”。
  • 感谢 Danny 的回复,但我确信在 JSON 中可以不加引号地使用 true、false 和 null。请参阅 www.json.org。
  • 你可能是对的,但我误解了你。在 Javascript 端对数据进行字符串化解决了这个问题。

标签: jquery ajax null


【解决方案1】:

您可以使用 undefined 代替 null

data: {
  valueTrue : true,
  valueFalse: false,
  valueNull : undefined
}

【讨论】:

    【解决方案2】:

    对于遇到此问题的任何人,该错误已在 jQuery 1.8 中修复

    https://github.com/jquery/jquery/pull/714

    【讨论】:

      【解决方案3】:

      我希望它以 valueNull= 而不是 valueNull=null 的形式发送查询参数,这是我的经验。

      如果您使用 JSON 进行 REST,您仍然需要为 GETS 发送查询参数,并且您不能将所有的 GETS 转换为 POSTS 来解决这个问题。

      【讨论】:

        【解决方案4】:

        你会期待什么?您将此值作为 POST 参数发送,它们是简单的文本字符串。如果您想要类型安全的传输,请使用某种编码,例如 JSON。 (这不是dataType 所做的——它指的是来自服务器的响应。)

        【讨论】:

        • 谢谢。将数据编码为 JSON 解决了​​这个问题。我误解了“dataType”选项的用途。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-20
        • 2023-03-16
        • 1970-01-01
        相关资源
        最近更新 更多