无法读取json编码数据

时间:2015-11-27 02:33:00

标签: javascript php jquery json ajax

我正在开发一个超级简单的聊天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编码的字符串,因为它意味着{{1} 1}},那么问题可能在于我传递这些参数的方式?只是猜测。 我对jQuery ajax很新,我已经检查过,经过双重检查和三重检查,但我不知道自己做错了什么。 感谢任何可以创造魔力的人。

5 个答案:

答案 0 :(得分: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,你没有这样做。

答案 1 :(得分:0)

使用PHP代码中的header("Content-Type: application/json", true);指定PHP返回json可以提供帮助

答案 2 :(得分:0)

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

PHP有办法获取POST数据。

1. $ _ POST,通常用于表单数据

2. $ HTTP_RAW_POST_DATA,如果你无法从$ _POST获取数据,请试试这个。

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

答案 3 :(得分:0)

您的参数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 - 编码(主要用于文件上传)

解决方案1 ​​

发送json并通过json获取php://input数据请求,更改您的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',这是您从一开始就期望的。

答案 4 :(得分:0)

解决方案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