
本文详解 jquery ajax 以 application/json 方式发送数据时的常见错误及解决方案,重点解决 php 端无法接收 post 数据的问题,涵盖数据序列化、content-type 设置、php 端解析方法及完整可运行示例。
本文详解 jquery ajax 以 application/json 方式发送数据时的常见错误及解决方案,重点解决 php 端无法接收 post 数据的问题,涵盖数据序列化、content-type 设置、php 端解析方法及完整可运行示例。
在使用 jQuery 的 $.ajax() 向 PHP MVC 控制器(如 Laravel、CodeIgniter 或原生 PHP)传递结构化数据时,一个高频陷阱是:前端明明发送了 JSON,后端却读不到 $_POST 中的数据,甚至得到空数组 array(0)。根本原因在于:当设置 contentType: "application/json" 时,jQuery 将原始 JSON 字符串作为请求体(payload)发送,而 PHP 默认不会自动解析 JSON 格式的请求体到 $_POST——此时 $_POST 始终为空,必须手动读取 php://input 并解码。
✅ 正确的前端写法(推荐)
$(".application-accept").click(function(event) {
event.preventDefault(); // 防止默认提交行为
const dataToSend = {
list: [
{ fieldname: 'ABC' },
{ fieldname: 'DEF' }
]
};
$.ajax({
url: "/olad2/project/processapplication/1",
method: "POST",
data: JSON.stringify(dataToSend), // 序列化为字符串
contentType: "application/json; charset=utf-8", // 关键:声明内容类型
dataType: "json" // 注意:是 dataType(响应预期格式),非 datatype(拼写错误!)
})
.done(function(response) {
console.log("Success:", response);
})
.fail(function(xhr, status, error) {
console.error("Error:", xhr.status, xhr.responseText);
});
});
⚠️ 注意事项:
- dataType 必须拼写正确(不是 datatype),否则 jQuery 可能忽略响应解析逻辑;
- data 字段必须是字符串(用 JSON.stringify() 包裹),不能传对象,否则 jQuery 会按 application/x-www-form-urlencoded 方式序列化,与 contentType 冲突;
- 建议添加 event.preventDefault() 避免表单重复提交。
✅ PHP 控制器端正确接收方式
由于数据以 application/json 形式提交,PHP 不会填充 $_POST,需主动读取原始输入流:
// 在控制器中(例如 processapplication 方法内)
$input = file_get_contents('php://input');
$data = json_decode($input, true); // 第二个参数 true → 返回关联数组
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo json_encode(['error' => 'Invalid JSON']);
exit;
}
// 此时 $data['list'] 即为前端发送的数组
var_dump($data['list']);
// 输出:array(2) { [0]=> array(1) { ["fieldname"]=> string(3) "ABC" } ... }
// 后续业务逻辑处理...
echo json_encode(['success' => true, 'received' => $data['list']]);
❌ 常见错误对比与修复
| 错误做法 | 后果 | 修复方案 |
|---|---|---|
| data: {list: [...]}(未 stringify) + contentType: "application/json" | jQuery 自动转为表单编码,服务端收到乱码或空值 | ✅ 必须 JSON.stringify() |
| datatype: "JSON"(拼写错误) | jQuery 不执行 JSON 解析,response 为字符串 | ✅ 改为 dataType: "json" |
| 仅依赖 $_POST 读取数据 | 始终返回 array(0) | ✅ 改用 file_get_contents('php://input') + json_decode() |
? 替代方案:不设 contentType(更兼容)
若不想处理 php://input,可让 jQuery 使用默认表单编码,并将数据作为普通键值对发送:
$.ajax({
url: "/olad2/project/processapplication/1",
method: "POST",
data: {
list: JSON.stringify([{ fieldname: 'ABC' }, { fieldname: 'DEF' }])
} // 不设 contentType → 自动为 application/x-www-form-urlencoded
});
PHP 端直接获取:
$listJson = $_POST['list']; $list = json_decode($listJson, true);
但此方式失去原生 JSON 类型语义,推荐优先采用标准 JSON POST 方式。
掌握 contentType 与数据序列化的匹配关系,是前后端 JSON 通信稳定可靠的关键。务必从前端发送格式、HTTP 头声明、后端解析路径三方面统一设计,避免“看似发送成功,实则后端收不到”的静默失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











