php怎么实现RESTful API_php构建标准接口返回JSON【接口】

2次阅读

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

php怎么实现RESTful API_php构建标准接口返回JSON【接口】

PHP怎么设置正确的Content-Type返回JSON

不设对 Content-Type,前端拿到的就不是合法 JSON,fetch().json() 会直接报错或解析失败。PHP 默认输出是 text/html,必须手动覆盖。

  • header('Content-Type: application/json; charset=utf-8');,不能漏掉 charset=utf-8,否则中文变乱码
  • 确保这行代码在任何 echoprint 或空白输出之前执行,否则会触发 “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/jsonbody$_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-urlencodedmultipart/form-data
  • 如果用框架(如 Slim、laravel),它们已封装好,但底层逻辑一样:读 php://inputjson_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,前端就要花半天查是不是自己写错了。

text=ZqhQzanResources