PHP接口返回JSON失败主因是输出不纯净或JS请求格式不匹配PHP期望;需清除BOM/错误/缓冲并设正确header,JS须按Content-Type匹配$_POST或php://input读取。
常见现象是 fetch 或 $.ajax 拿到响应后,response.json() 报错 Unexpected token,或 data 是空对象、undefined。根本原因往往是 PHP 没输出纯 JSON,夹杂了警告、Notice、BOM 头或 echo 了调试语句。
header('Content-Type: applicatio
n/json; charset=utf-8');
error_reporting(0); ini_set('display_errors', '0');(上线必须关,调试时也建议先关)ob_clean(); 清掉之前可能存在的输出缓冲,再调用 echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit; 阻止后续代码执行(尤其避免框架自动渲染模板)典型表现:PHP 中 var_dump($_POST) 为空数组,但 JS 明明传了数据。问题不在 PHP,而在 JS 请求方式与 PHP 解析机制不匹配。
fetch + JSON.stringify() 发送,后端不会进 $_POST,得用 file_get_contents('php://input') 手动读原始体$_POST,JS 必须发 application/x-www-form-urlencoded(如 new URLSearchParams(data))或 multipart/form-data(如 FormData)encodeURIComponent() 包裹,否则 PHP $_GET 解析失败client_max_body_size / post_max_size),超限会导致整个 $_POST 为空不是“看不到”,而是默认过滤或未触发。关键要确认三点:是否发起、是否被拦截、是否被缓存。
Preserve log,防止页面跳转后记录清空Size 和 Time,快速识别 204/304/Failed 请求Headers 标签页:确认 Request Method、Request URL、Request Payload(非 Form Data)、Response 内容是否符合预期Preview 或 Response 标签页最直观这种情况多见于预检请求(OPTIONS)失败,而浏览器只静默丢弃,不抛 JS 异常。JS 的 catch 捕获不到,Network 里却能看到一个失败的 OPTIONS 请求。
Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers
Access-Control-Allow-Credentials: true,且前端 fetch 要设 credentials: 'include'
$_SERVER['REQUEST_METHOD'] === 'OPTIONS' 并 exitif ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
header('Access-Control-Allow-Origin: http://localhost:3000');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, X-Requested-With');
header('Access-Control-Allow-Credentials: true');
exit;
}
实际调试中,90% 的交互问题出在“PHP 输出不干净”或“JS 请求格式和 PHP 期望不一致”这两点。别急着查文档,先看 Network 里的原始请求体和响应体——那才是唯一真相。