php 返回 json 给 vue 的关键在于正确设置 header、编码及避免错误输出:必须显式声明 content-type: application/json,使用 json_encode($data, json_unescaped_unicode | json_unescaped_slashes),并确保无 warning/fatal error 干扰响应体,vue 侧需按 axios 或 fetch 差异正确解析,同时显式设置 http 状态码并处理 cors。

PHP 返回 JSON 给 Vue,关键不是“怎么返回”,而是“怎么不踩坑地返回”——绝大多数问题出在 header、编码、错误输出和 Vue 的响应解析方式上。
header('Content-Type: application/json') 必须显式设置
PHP 默认 Content-Type 是 text/html,Vue 的 axios 或 fetch 在收到非 application/json 响应时,即使内容是合法 JSON,也可能拒绝自动解析(尤其 axios 会抛 JSON parse error)。
常见错误现象:Unexpected token 或空响应,但浏览器 Network 面板里能看到 JSON 文本。
- 必须在
echo json_encode(...)前调用header('Content-Type: application/json; charset=utf-8') - 不能有任意前置输出(包括 BOM、空格、
echo、var_dump、甚至文件末尾的换行) - 如果用了框架(如 Laravel),优先走框架的 JSON 响应方法(如
response()->json()),它已内置 header 和编码处理
json_encode() 的参数别硬写 true
直接 json_encode($data) 很危险:中文变 Unicode(\u4f60\u597d)、null 变空字符串、对象属性丢失、浮点数精度错乱……
立即学习“PHP免费学习笔记(深入)”;
使用场景:你传的是关联数组(即 PHP 的“字典”),不是索引数组;且数据含中文、时间戳、DateTime 对象、或需要兼容老版 IE(虽已极少)。
- 加
JSON_UNESCAPED_UNICODE:保留中文原样,不转义 - 加
JSON_UNESCAPED_SLASHES:避免 URL 中的/被转成\/ - 生产环境建议加
JSON_INVALID_UTF8_SUBSTITUTE(PHP 7.2+),防止非法 UTF-8 字符导致整个json_encode()返回false - 示例:
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
Vue 接收时别假设 response.data 总是你要的东西
Vue 侧最常出问题的地方不是 PHP,而是对 HTTP 响应结构理解偏差。Axios 默认把 JSON body 提取到 response.data,但 fetch 不会。
常见错误现象:Vue 报 Cannot read property 'xxx' of undefined,但后端明明返回了正确 JSON。
- 用
axios:直接解构response.data,但先检查response.status === 200 - 用
fetch:必须手动response.json(),且要await,不能直接读response.data(它不存在) - PHP 如果输出了 warning(比如
undefined index),即使 header 正确,也会混在 JSON 前面,导致整个响应体非法——Vue 解析失败,但 Network 面板可能只显示开头几行,容易忽略 - 调试时,在 Vue 中打印
response.text()(fetch)或response全量对象(axios),确认原始响应体是否干净
跨域、404、500 这些状态码 Vue 看不见
PHP 返回 JSON,不代表 Vue 就能拿到它。HTTP 状态码才是第一道关卡。
使用场景:接口路径写错、PHP fatal error、Apache/Nginx 配置错误、CORS 头缺失。
- PHP 发生 fatal error(如调用未定义函数),不会执行
json_encode,而是返回 500 页面 HTML,但前端仍尝试解析 JSON → 直接报错 - Vue 的
axios默认只把 2xx 视为 success,404/500 会进.catch(),此时error.response可能为undefined(网络层失败)或含 HTML 内容(服务端错误) - 务必在 PHP 入口加
http_response_code(200)显式设状态码,避免被框架或错误处理逻辑覆盖成 500 - CORS 头(
Access-Control-Allow-Origin)必须由 PHP 输出(或 Web 服务器配置),仅前端改请求没用
真正卡住人的,往往不是 json_encode 怎么写,而是 PHP 脚本里多了一行 echo 'debug';,或是 Vue 用 fetch 却当成 axios 用,又或者 Nginx 把 .php 文件当静态资源返回了 404 HTML —— 这些地方一漏,JSON 就永远到不了 Vue 手里。











