原生php需正确处理http方法分发、json解析、路径参数提取及状态码协同:用file_get_contents('php://input')读json并校验,正则强校验url id并转int,json_encode加json_unescaped_unicode,严格按语义返回http状态码且头信息须在任何输出前发送。

直接用原生 PHP 就能跑通,关键不是“用不用框架”,而是四件事必须对上:HTTP 方法分发、JSON 请求体解析、路径参数提取、状态码与响应体协同。
怎么正确读取 POST/PUT 的 JSON 数据
前端用 fetch 或 axios 发 application/json 请求时,$_POST 是空的——它只处理表单编码,不处理原始 JSON 流。
- 必须用
file_get_contents('php://input')读取原始请求体 - 读完后要
trim(),否则 BOM 或换行会导致json_decode()返回null - 用
json_decode($raw, true)转为关联数组,并检查$data !== null && json_last_error() === JSON_ERROR_NONE - 别在
json_decode前输出任何内容(包括空格、BOM、echo),否则会破坏响应流
如何安全提取 URL 中的 ID 参数
不能靠 $_GET 或简单 explode 拆路径,否则容易被注入或越权访问(比如 /api/users/123;admin=1)。
- 用
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)获取干净路径 - 用正则强校验,例如
preg_match('@^/api/users/(\d+)$@', $path, $matches),只接受纯数字 ID - 匹配失败就返回
http_response_code(404),不往下执行业务逻辑 - 数据库查询前,ID 必须强制转为
(int)或用预处理语句绑定,杜绝字符串拼接
为什么 json_encode 输出中文是 \uXXXX
不是函数问题,是默认行为。PHP 把非 ASCII 字符转成 Unicode 转义,可读性差,前端也不好调试。
- 必须传
JSON_UNESCAPED_UNICODE标志:json_encode($data, JSON_UNESCAPED_UNICODE) - 确保 PHP 文件本身是 UTF-8 无 BOM 编码(编辑器里看得到,不是“UTF-8”就完事)
- 别在数据进
json_encode前手动urlencode或htmlspecialchars,那会让中文变成乱码 - 如果字段名也是中文(如
['用户名' => '张三']),同样需要这个标志,否则键名也被转义
哪些 HTTP 状态码不能省略
只返回 200 OK + JSON 是最大误区。客户端(尤其是 Axios、React Query)依赖状态码做自动重试、缓存、错误提示。
-
POST /api/users成功 →http_response_code(201),并加header('Location: /api/users/123') -
GET /api/users/999找不到 →http_response_code(404),不是200+{} -
DELETE /api/users/123成功 →http_response_code(204),响应体为空,不要输出null或'' -
PUT /api/users/123数据校验失败 →http_response_code(400),响应体含['error' => 'Invalid email']
最容易被忽略的是:所有 header() 和 http_response_code() 必须在任何 echo、print、空白字符甚至 PHP 开始标签 <?php 前调用。一旦有前置输出,头就发不出,状态码和 Content-Type 全失效。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











