下面给你一份 在 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();


八、快速对照表

场景推荐
TP6request()->param()
TP5php://input
Ajax JSONapplication/json
通用isJson()

九、一句话总结

ThinkPHP 接收 Ajax JSON 的核心只有一句话:前端用 application/json,后端不用 $_POST