能跑通的php restful接口需四步:用$_server['request_method']分发http方法,file_get_contents('php://input')解析json请求体,正则从request_uri提取路径参数,按语义返回201/204/400/404等状态码。

怎么用 $_SERVER['REQUEST_METHOD'] 正确分发 GET/POST/PUT/DELETE
PHP 不会自动按 HTTP 动词路由,必须手动判断,否则所有请求都走同一个分支,405 Method Not Allowed 就是典型信号。
常见错误是只处理 GET 和 POST,漏掉 PUT 和 DELETE;或把 PUT 当成 POST 用 $_POST 读数据——这根本读不到。
- 入口文件开头立即调用
http_response_code(200)和header('Content-Type: application/json; charset=utf-8'),避免后续输出污染响应头 - 用
switch ($_SERVER['REQUEST_METHOD'])显式分支,每个 case 后加exit;防止穿透执行 -
PUT和DELETE请求通常带 ID,需从 URL 中提取,不能靠$_GET或$_POST
为什么 file_get_contents('php://input') 不能省,而 $_POST 不行
前端用 fetch 或 axios 发 application/json 请求时,数据在原始请求体里,$_POST 只接收 application/x-www-form-urlencoded 和 multipart/form-data,直接读 $_POST 必然为空数组。
错误现象:前端传了 {"name":"Alice"},后端 var_dump($_POST) 是空的,但接口逻辑却报“缺少 name 字段”。
- 统一用
$raw = file_get_contents('php://input')获取原始 body - 必须
trim($raw)再json_decode($raw, true),否则 BOM 或换行会导致json_last_error()返回JSON_ERROR_SYNTAX - 检查
$data !== null && json_last_error() === JSON_ERROR_NONE,失败时返回http_response_code(400)
如何从 $_SERVER['REQUEST_URI'] 安全提取 /users/123 中的 123
RESTful 路由不是靠 .htaccess 重写才叫 RESTful,关键是路径语义清晰。即使不用重写,也要能从原始 URI 解析出资源 ID。
典型坑:正则没加边界或没转义,preg_match('@/users/(\d+)@', $_SERVER['REQUEST_URI'], $matches) 匹配到 /users/123abc 的 123,导致非法 ID 进入查询。
- 用
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)先剥离查询参数和 host - 匹配时加锚点:
preg_match('@^/api/users/(\d+)$@', $path, $matches) - 强转
(int) $matches[1]并验证 > 0,防止字符串 ID 绕过校验 - 没匹配到 ID 时,按
GET /api/users处理,别硬塞默认值
哪些 HTTP 状态码不能乱设,尤其别用 200 代替 201 或 204
状态码不是装饰,前端 SDK(比如 Vue Query、React Query)会根据它自动做缓存失效、重试、乐观更新等动作。返回错的状态码,前端行为就不可控。
常见反模式:DELETE /users/123 成功后 echo {"status":"ok"} + http_response_code(200),结果前端没清本地缓存,再进列表页还显示已删用户。
-
POST /users创建成功 →http_response_code(201)+header('Location: /users/123') -
GET /users/999找不到 →http_response_code(404),不是200+{"error":"not found"} -
DELETE /users/123成功 →http_response_code(204)+ 空响应体,不要 JSON -
PUT /users/123ID 不合法 →http_response_code(400),不是500
204 必须空响应体,比如 php://input 读完就没了,比如 Location 头里的路径必须绝对。这些细节不抠准,接口就只是“能用”,不是“可用”。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











