php返回json需设置header('content-type: application/json; charset=utf-8'),封装api_response()统一结构,用php://input解析post json并校验,get防缓存、修改操作禁用get。

PHP怎么设置正确的Content-Type返回JSON
不设对 Content-Type,前端拿到的就不是合法 JSON,fetch().json() 会直接报错或解析失败。PHP 默认输出是 text/html,必须手动覆盖。
- 用
header('Content-Type: application/json; charset=utf-8');,不能漏掉charset=utf-8,否则中文变乱码 - 确保这行代码在任何
echo、print或空白输出之前执行,否则会触发 “Headers already sent” 错误 - 不要用
header('Content-Type: text/plain')或application/javascript冒充 JSON —— 浏览器和 Axios 都会拒绝解析
怎么统一处理API响应结构(避免每个接口都手写array)
硬编码 ['code' => 0, 'data' => [...], 'msg' => 'ok'] 看似简单,但字段名不一致、缺 code、漏 data、错误时没 msg,后期联调全靠猜。
- 封装一个简单函数,比如
api_response($data = null, $code = 0, $msg = 'success'),内部统一校验和组装 -
$code建议用常量定义(如const CODE_SUCCESS = 0;),别用字符串或魔法数字 - 空数据时,
$data应传null而非[],否则前端难以区分“无数据”和“空数组” - 别在响应里塞 PHP 调试信息(如
debug_backtrace()),生产环境必须关掉
如何安全接收并解析POST过来的JSON请求体
前端发的是 fetch('/user', { method: 'POST', body: JSON.stringify({...}) }),但 PHP 默认不自动解析 application/json 的 body,$_POST 是空的。
- 用
$raw = file_get_contents('php://input');拿原始请求体,再用json_decode($raw, true) - 必须检查
json_last_error() === JSON_ERROR_NONE,否则前端传了个格式错的 JSON,后端直接返回null,很难定位 - 别用
$_POST试图读 JSON 数据 —— 它只处理application/x-www-form-urlencoded和multipart/form-data - 如果用框架(如 Slim、Laravel),它们已封装好,但底层逻辑一样:读
php://input→json_decode→ 校验
为什么用GET传参数总被缓存,而POST又不能刷新重发
浏览器对 GET 请求强制缓存(尤其带相同 query string 时),导致改了数据但接口返回旧结果;而 POST 刷新会弹“重复提交”警告,用户体验差。
立即学习“PHP免费学习笔记(深入)”;
- 纯查询类接口(如搜索、详情)用 GET,但加个时间戳或随机参数(如
?_t=1715234567)防缓存 —— 更稳妥的是服务端加Cache-Control: no-store - 修改类操作(增删改)必须用 POST/PUT/DELETE,且前端要主动处理重复提交(如按钮置灰、加 loading 状态)
- 别为了“省事”把修改操作改成 GET(如
/delete?id=123),容易被爬虫或代理批量触发 - RESTful 不是教条,重点是语义清晰:GET 不该有副作用,其他方法必须明确意图
真正难的不是写个 json_encode(),而是所有接口在 Content-Type、错误码、空值处理、输入校验上保持一致。一旦某个接口漏了 header 或返回了 string 而不是 object,前端就要花半天查是不是自己写错了。











