我正在开发一个超级简单的聊天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包含消息文本。
我得到的只是一个空白页面。
此外,如果我发送没有dataType
和contentType
参数的ajax请求并运行没有.refreshChat
的回调,它会打印json编码的字符串,因为它意味着{{1} 1}},那么问题可能在于我传递这些参数的方式?只是猜测。
我对jQuery ajax很新,我已经检查过,经过双重检查和三重检查,但我不知道自己做错了什么。
感谢任何可以创造魔力的人。
答案 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)
您的参数dataType
和data
没有问题,问题在于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
- 编码(主要用于文件上传)发送json
并通过json
获取php://input
数据请求,更改您的PHP代码以接收JSON数据而不是$_POST
:
$.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
从Ajax调用中删除contentType
参数,默认为'application/x-www-form-urlencoded; charset=UTF-8'
,这是您从一开始就期望的。
答案 4 :(得分:0)
您可以而且应该设置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来检测如何处理它。
或者我们可以解决它:
$.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