用原生PHP快速实现RESTful接口,关键是正确获取HTTP方法($_SERVER['REQUEST_METHOD'])、设置状态码(http_response_code())和JSON响应(header('Content-Type: application/json; charset=utf-8') + json_encode(..., JSON_UNESCAPED_UNICODE)),并按Content-Type区分读取$_POST或php://input,避免混淆表单与JSON数据,同时用简单路径解析(如explode)替代复杂路由,开发阶段推荐php -S内置服务器。

怎么用原生PHP快速响应GET/POST请求
不用框架也能写RESTful接口,关键是把HTTP方法、状态码和JSON响应三件事做对。PHP内置的 $_SERVER['REQUEST_METHOD'] 能直接拿到方法名,别硬套路由规则或重写URL——开发阶段用 php -S 内置服务器最省事。
常见错误是忽略Content-Type头导致前端解析失败,或者把POST表单数据(application/x-www-form-urlencoded)和JSON(application/json)混着读。实际要分情况处理:
- 如果是
application/json,用json_decode(file_get_contents('php://input'), true)读原始body - 如果是表单提交,直接用
$_POST即可,但必须检查$_SERVER['CONTENT_TYPE']判断类型 - 所有响应前加
header('Content-Type: application/json; charset=utf-8'),否则中文会乱码
如何正确返回HTTP状态码和JSON数据
RESTful不是只换URL后缀,状态码才是语义核心。比如查不到资源必须返回404,而不是200+{“error”: “not found”}。PHP里用 http_response_code() 设置状态码,它比手动写 header('HTTP/1.1 404 Not Found') 更可靠,尤其在CLI SAPI下不会失效。
示例:获取用户ID为5的记录
立即学习“PHP免费学习笔记(深入)”;
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['id'])) {
$id = (int)$_GET['id'];
$user = ['id' => $id, 'name' => 'Alice']; // 模拟查询
if ($user) {
http_response_code(200);
echo json_encode($user, JSON_UNESCAPED_UNICODE);
} else {
http_response_code(404);
echo json_encode(['error' => 'User not found'], JSON_UNESCAPED_UNICODE);
}
}
注意 JSON_UNESCAPED_UNICODE,不然中文变成\uXXXX;也别漏掉 exit 或 die,避免后续代码意外输出干扰JSON结构。
为什么PUT/DELETE请求收不到数据
浏览器表单不支持PUT/DELETE,所以前端通常用POST模拟,并在header里加 X-HTTP-Method-Override: PUT。但PHP默认不解析这类请求的body,$_PUT 和 $_DELETE 是不存在的超全局变量。
解决办法只有两个:
- 前端真发PUT/DELETE请求(用fetch/fetch +
method: 'PUT'),后端用file_get_contents('php://input')手动读取 - 服务端主动识别
X-HTTP-Method-Override头,把请求转成对应逻辑,但要注意CSRF风险
别试图用 parse_str() 解析PUT body——它只处理 application/x-www-form-urlencoded,而大多数REST客户端发的是JSON。
路由怎么写才不至于一团糟
初期别搞正则路由或中间件。用最直白的路径判断,比如 /api/users 对应用户列表,/api/users/123 对应单个用户。提取ID用 explode('/', trim($_SERVER['REQUEST_URI'], '/')) 就够用,别一上来就引入Router类。
容易被忽略的是PATH_INFO问题:用 php -S localhost:8000 router.php 启动时,$_SERVER['PATH_INFO'] 才有值;Apache/Nginx需要配置重写规则才能让PATH_INFO生效,否则所有请求都落到index.php,还得自己从 $_SERVER['REQUEST_URI'] 截字符串。
更稳妥的做法是统一用查询参数传动作,比如 /api?resource=users&id=123&method=GET,虽然不够“RESTful”,但能绕过所有Web服务器兼容性问题。



















