【问题标题】:Can't read json encoded data无法读取 json 编码数据
【发布时间】:2015-11-27 14:32:11
【问题描述】:

我正在开发一个基于 php 和 jQuery ajax 的超级简单聊天,但在通过 ajax 回调函数显示 json 编码字符串时遇到问题。

这里是 ajax 请求:

$.ajax({
  url: "/pages/core.chat.php",
  type: "POST",
  dataType: "json",
  contentType: "application/json",
  data: {'action' : 'loadChat'},

  success: function(resp) {
    $("#chatBody").html(resp.refreshChat);
 }

});

这是来自 .php 文件

if ($_POST['action'] == 'loadChat') {   
    $resp = array("refreshChat"=>$chat);
    echo json_encode($resp);
}

其中 $chat 包含消息文本。 我得到的只是一个空白页。 此外,如果我发送没有dataTypecontentType 参数的ajax 请求并在没有.refreshChat 的情况下运行回调,它会打印json 编码字符串,因为它应该是{"refreshChat":"chatmessage"},所以问题可能出在方式上我正在传递那些参数?只是猜测。 我对 jQuery ajax 很陌生,我已经检查过、双重检查和三重检查,但我不知道我做错了什么。 感谢任何可以创造魔法的人。

【问题讨论】:

  • php 中的 $chat var 中有什么?
  • 如果你这样做 console.log(resp) 你会得到什么,我只是好奇
  • 你声明这个了吗 -> $resp = array();
  • 移除 "contentType: "application/json","

标签: javascript php jquery json ajax


【解决方案1】:

使用 contentType: 'application/json' 时,您将无法依赖 $_POST 被填充。 $_POST 仅为表单编码的内容类型填充。

 $.ajax({
  url: "/pages/core.chat.php",
  type: "POST",
  dataType: "json",
  contentType:"application/x-www-form-urlencoded",
  data: {'action' : 'loadChat'},

  success: function(resp) {
    $("#chatBody").html(resp.refreshChat);
 }

});

如果你想发送 contentType:application/json 你应该发送 JSON,你没有这样做。

【讨论】:

    【解决方案2】:

    在 PHP 代码中使用 header("Content-Type: application/json", true); 来指定 PHP 返回 json 可能会有所帮助

    【讨论】:

    • 在ajax请求中指定dataType: "json",
    • 确实@guradio,javascript 代码指定它希望得到一个 json 响应,但 Web 服务器可能会以不同的 MIME 类型响应。在 PHP 代码中特别放置标头可能有助于调试问题。
    • 这无法解决问题,请在发送答案前测试您的代码
    【解决方案3】:

    我遇到了一个和你类似的问题。这是我的答案。

    PHP 有办法获取 POST 数据。

    1.$_POST,一般用于表单数据

    2.$HTTP_RAW_POST_DATA,如果你不能从$_POST获取数据,试试这个。

    3.$raw_post_data =file_get_contents('php://input', 'r');与$HTTP_RAW_POST_DATA基本相同,但更有效。

    【讨论】:

      【解决方案4】:

      您的参数dataTypedata 没有问题,问题出在contentType: "application/json",如果您使用Chrome Dev Tools 或类似的工具来检查服务器响应,您应该会看到如下内容:

      <br />
      <b>Notice</b>:  Undefined index: action in <b>core.chat.php</b> on line <b>x</b><br />
      

      这是因为 core.chat.php 正在检查 POST 参数,而您正在发送 JSON

      PHP 超全局$_POST,只有应该包装数据,要么是

      • application/x-www-form-urlencoded(简单表单帖子的标准内容类型)或
      • multipart/form-data-encoded(多用于文件上传)

      解决方案 1

      发送json 并通过php://input 获取json 数据请求,更改您的PHP 代码以接收JSON 数据而不是$_POST

      在ajax调用中更改数据参数:

      $.ajax({
        url: "/pages/core.chat.php",
        type: "POST",
        dataType: "json",
        contentType: "application/json",
        data: JSON.stringify({'action' : 'loadChat'}), //Send JSON
      
        success: function(resp) {
          $("#chatBody").html(resp.refreshChat);
       }
      
      });
      

      更改您的 PHP 文件以获取 json 数据并进行处理:

      $data = json_decode(file_get_contents('php://input'), true);
      if($data['action'] == 'loadChat')
         //do something
      

      解决方案 2

      从 Ajax 调用中删除 contentType 参数,默认为 'application/x-www-form-urlencoded; charset=UTF-8',这是您从一开始就期望的。

      【讨论】:

        【解决方案5】:

        解决方案 1

        您可以并且应该设置 Content-Type 标头:

        <?php
        header('Content-Type: application/json');
        
        # Code ...
        
        if ($_POST['action'] == 'loadChat') {   
            $resp = array("refreshChat"=>$chat);
            echo json_encode($resp);
        }
        

        否则,返回 PHP 的只是文本。 更多信息:Returning JSON from a PHP Script

        Content-type 标头仅用作您的应用程序的信息。浏览器不在乎它是什么。浏览器只是返回来自 AJAX 调用的数据。如果你想把它解析为 JSON,你需要自己做。

        标头在那里,因此您的应用可以检测返回的数据以及应如何处理这些数据。您需要查看标头,如果是 application/json 则将其解析为 JSON。

        这实际上是 jQuery 的工作方式。如果你不告诉它如何处理结果,它会使用 Content-type 来检测如何处理它。

        -- Rocket Hazmat - HTTP Content-Type Header and JSON

        解决方案 2

        或者我们可以修复它:

        $.ajax({
            url: "/pages/core.chat.php",
            type: "POST",
            dataType: "json",
            contentType: "application/json",
            data: {'action' : 'loadChat'},
        
            success: function(resp) {
                // JSON.parse solution
                resp = JSON.parse();
                $("#chatBody").html(resp.refreshChat);
            }
        
        });
        

        文档:JSON.parse

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-27
          • 2018-12-24
          • 2016-10-21
          • 1970-01-01
          • 2020-05-22
          • 2021-04-09
          • 2015-09-03
          • 2023-03-05
          相关资源
          最近更新 更多