答案是:用$_server['request_method']全大写比对get/post/put/delete,switch分发动词,前置设置header('content-type: application/json'),未支持方法返回http_response_code(405)并设allow头。

怎么用 $_SERVER['REQUEST_METHOD'] 正确分发 HTTP 动词
PHP 原生开发 RESTful 接口,第一步不是写逻辑,而是把请求动词路由对。很多人直接写 if ($_POST) 或只处理 $_GET,结果 PUT/PATCH/DELETE 请求全被忽略,前端报 405 或静默失败。
-
$_SERVER['REQUEST_METHOD']是唯一可靠来源,它返回字符串GET、POST、PUT等,大小写敏感,必须全大写比对 - 别依赖
$_POST判断是否是 POST —— 当 Content-Type 是application/json时,$_POST永远为空,但$_SERVER['REQUEST_METHOD']仍是POST - 未支持的方法必须显式返回
http_response_code(405)并输出header('Allow: GET, POST, PUT, DELETE'),否则 Nginx/Apache 可能拦截并返回 501 - 在 switch 分支前加
header('Content-Type: application/json; charset=utf-8'),避免后续任何 echo/print 导致 headers already sent 错误
为什么 file_get_contents('php://input') 不能省略
现代前端(axios/fetch)发 JSON 数据时,默认用 Content-Type: application/json,而 PHP 不会自动解析它到 $_POST 或 $_REQUEST。跳过这步,json_decode($_POST) 永远是 null,业务逻辑直接中断。
-
file_get_contents('php://input')是读取原始请求体的唯一方式,仅对POST、PUT、PATCH、DELETE有效;GET请求没有 body,该函数返回空字符串 - 必须
trim()结果:某些客户端(尤其移动端 SDK)会在 JSON 前后加 BOM 或空白,导致json_decode()返回null且json_last_error()为JSON_ERROR_SYNTAX - 验证解析结果:
$data = json_decode($raw, true); if ($data === null && json_last_error() !== JSON_ERROR_NONE)才算真正失败,否则可能是空对象{}或空数组[],需按业务判断是否合法
响应状态码和结构怎么才算“RESTful”
只返回 200 OK + json_encode($data) 不是 RESTful。状态码是契约的一部分,前端靠它决定是否跳转、清缓存、重试或弹错误提示。错用会导致前端逻辑错乱。
- 创建成功必须用
http_response_code(201),不是 200;同时可选加header('Location: /api/users/' . $id),让客户端知道新资源地址 - 删除成功推荐用
http_response_code(204)(无响应体),而非 200 +{"success":true}—— 204 明确表示“操作完成,无需返回内容”,减少传输开销 - 统一响应结构建议包含
code(HTTP 状态码副本)、data(业务数据)、message(简短提示),但不要冗余嵌套,例如避免{"result":{"code":200,"data":{...}}} - 出错时优先用语义化状态码:参数缺失用
400,资源不存在用404,权限不足用401或403,服务异常才用500
URL 路径设计最容易踩的三个坑
路径不是随便拼的,它定义了资源边界。写错一个斜杠或动词,整个接口就偏离 RESTful 原则,后期难维护也难对接。
- 资源名必须用复数名词:
/users、/orders,而不是/user或/getUsers;/users/123表示 ID=123 的用户,不是/user?id=123 - 避免在路径里塞动词:
/users/activate、/products/search是反模式;激活用户应 PATCH/users/123+ 字段{"status":"active"},搜索应 GET/products?keyword=xxx - 子资源用层级表达:
/users/123/posts表示该用户的全部文章,/users/123/posts/456表示其中某一篇;不要写成/posts?user_id=123,除非你明确不打算支持嵌套操作
{},或返回 404 时却塞了个 {"error":"not found"} —— 这会让前端的 fetch().then() 误判为成功,后续逻辑全崩。RESTful 不是语法糖,是通信契约。大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











