PHP直接echo JSON不是真正API,需路径路由、HTTP方法区分、状态码控制及Content-Type头;应统一处理GET/POST/JSON输入,清空缓冲区,用php://input读JSON体,并封装request()函数保障数据获取可靠性。
PHP脚本直接输出JSON不算API接口
单纯用 echo json_encode($data) 输出,没有请求方法区分、没有路径路由、没有状态码控制,只是“能返回JSON”,不是真正意义上的API接口。真正的API需要可预测的访问路径、明确的HTTP方法(GET/POST)、统一的错误响应格式,以及可被其他系统稳定调用的能力。
常见错误现象:file_get_contents('http://localhost/api/user.php?id=123') 调用成功,但换个参数就500;前端反复刷新出现乱码;POST数据收不到;跨域直接被浏览器拦截——这些都不是JSON没打好,是缺少基础API契约。
- 必须设置
Content-Type: application/json; charset=utf-8响应头,否则前端response.json()可能解析失败 - 不要依赖
$_GET或$_POST直接取值,要先判断请求方法,再决定从哪里读数据(GET参数 / POST表单 / JSON body) - 所有输出前清空缓冲区:
ob_end_clean(),避免BOM或意外空格导致JSON解析失败
用原生PHP写最小可用API路由(不依赖框架)
不需要引入Laravel或ThinkPHP,几行代码就能支撑基础路由。关键是把「路径 → 处理函数」映射起来,并统一处理输入输出。
示例结构(api/index.php):
立即学习“PHP免费学习笔记(深入)”;
'/api/users', 'method' => 'GET', 'handler' => function() {
echo json_encode(['users' => [['id' => 1, 'name' => 'Alice']]]);
}],
['path' => '/api/users', 'method' => 'POST', 'handler' => function() {
$input = json_decode(file_get_contents('php://input'), true) ?: [];
echo json_encode(['status' => 'created', 'id' => rand(100, 999)]);
}]
];
foreach ($routes as $route) {
if ($route['path'] === $path && $route['method'] === $method) {
$route['handler']();
exit;
}
}
http_response_code(404);
echo json_encode(['error' => 'Not Found']);
注意:php://input 是读取原始POST body的唯一可靠方式,$_POST 对JSON无效;parse_url(..., PHP_URL_PATH) 避免把查询参数混进路由判断。
GET/POST/JSON body数据怎么统一获取
前端可能用 fetch('/api/user', { method: 'POST', body: JSON.stringify(...) }),也可能用表单提交,后端不能假设数据来源。得按请求类型智能解析。