下面给你一份 在 ThinkPHP 中用 Ajax 接收 JSON 数据的完整、实战级讲解,覆盖 TP5 / TP6 常见写法👇
我会按 前端 → 后端 → 常见坑 → 调试技巧 来讲。
一、Ajax 发送 JSON 的正确方式(前端)
✅ 标准写法(jQuery 示例)
$.ajax({
url: '/index/user/save',
type: 'POST',
data: JSON.stringify({
username: 'tom',
age: 18
}),
contentType: 'application/json',
dataType: 'json',
success(res) {
console.log(res);
}
});
⚠️ 两个关键点(必须)
| 项 | 必须 |
|---|---|
JSON.stringify() | 是 |
contentType: application/json | 是 |
原生 fetch 写法(推荐)
fetch('/index/user/save', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: 'tom',
age: 18
})
})
.then(res => res.json())
.then(data => console.log(data));
二、ThinkPHP 6 接收 JSON 数据(推荐方式)
✅ Controller 中正确写法
use think\Request;
public function save(Request $request)
{
$data = $request->getInput(); // 读取 JSON 原始数据
return json([
'code' => 0,
'data' => $data
]);
}
等价写法(更常用)
public function save()
{
$data = request()->param(); // JSON / 表单都能接
return json($data);
}
📌 TP6 会自动解析 application/json
三、ThinkPHP 5 接收 JSON 数据的方法
方法 1:getContent()(最稳)
public function save()
{
$json = file_get_contents("php://input");
$data = json_decode($json, true);
return json($data);
}
方法 2:Request 对象
use think\Request;
public function save(Request $request)
{
$data = $request->param();
return json($data);
}
⚠️ TP5 对 JSON 支持不如 TP6 稳定,推荐方式 1
四、接收 JSON + 表单通用方案(通杀)
public function save()
{
$request = request();
if ($request->isJson()) {
$data = $request->getInput();
} else {
$data = $request->post();
}
return json($data);
}
五、完整示例(前后端配合)
前端
fetch('/index/user/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: 'admin',
password: '123456'
})
});
后端(TP6)
public function login()
{
$data = request()->param();
if ($data['username'] !== 'admin') {
return json(['code' => 1, 'msg' => '用户不存在']);
}
return json(['code' => 0, 'msg' => '登录成功']);
}
六、最容易踩的 5 个坑(重点)
❌ 1. 用 $_POST 接 JSON
$_POST['username']; // ❌ 永远是空
✔ JSON 不是 form-data
❌ 2. 忘记设置 contentType
contentType: 'application/json'
❌ 3. JSON 未 stringify
data: {a:1} // ❌
data: JSON.stringify({a:1}) // ✅
❌ 4. ThinkPHP 拦截 OPTIONS(跨域)
需要加跨域中间件或:
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Headers: Content-Type');
❌ 5. 请求方式不对
$request->post(); // 只能接 form
$request->param(); // JSON + form 都能接
七、调试技巧(非常实用)
打印原始 JSON
dump(file_get_contents("php://input"));
判断是否 JSON
request()->isJson();
八、快速对照表
| 场景 | 推荐 |
|---|---|
| TP6 | request()->param() |
| TP5 | php://input |
| Ajax JSON | application/json |
| 通用 | isJson() |
九、一句话总结
ThinkPHP 接收 Ajax JSON 的核心只有一句话:前端用
application/json,后端不用$_POST
发表回复