不用框架也能写RESTful接口,核心是用$_SERVER['REQUEST_METHOD']区分HTTP方法,json_encode()返回数据,并严格设置header('Content-Type: application/json; charset=utf-8'),任何输出前禁止echo、空白符或错误提示。
怎么用 PHP 快速写一个可被调用的 RESTful 接口
直接说结论:不用框架也能写,核心是靠
区分动作,用
返回数据,再加几行 header 设置。关键不是“多规范”,而是“别让前端拿不到数据”。
常见错误现象:
(没处理对应 HTTP 方法)、
(没设
或输出了额外空格)、前端收不到 JSON(header 没写对或用了
混淆)。
必须手动设置
,否则浏览器/前端可能当文本解析
所有输出前不能有任何
、
、空白符,包括文件末尾的换行
用
读取 POST/PUT 的原始 body,别只依赖
(它不处理 JSON)
简单接口建议用
分支,比一堆 if 更清晰
GET 和 POST 请求怎么分别处理才不踩坑
GET 用
拿参数没问题,但 POST 就容易错——尤其前端发的是 JSON 格式时,
是空的,因为 PHP 默认只解析
和
。
GET 接口示例路径:
→ 直接取
,记得用
过滤
POST 接口若接收 JSON:
→
,再检查
不要在同一个脚本里混用
和
,PHP 会因输入流已读完导致后者返回空字符串
如果用 cURL 测试,记得加
,否则服务端可能忽略 body
为什么返回 JSON 时 header 顺序和状态码这么重要
HTTP 状态码不是装饰,前端会根据它做逻辑分支;header 顺序不对,有些客户端(比如旧版 iOS WebView)会直接丢弃响应体。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
状态码必须在任何输出之前调用
或
,不能晚于
调用要在
之后、
之前
常见错误:先 echo 了错误提示,再想补 header → 报
简单判断是否已输出:用
检查,开发期建议开头就加这句做防护
要不要验证请求来源或加 Token 鉴权
纯内部系统调用可以暂时跳过,但只要接口暴露在公网或含用户数据,不加基础鉴权就是裸奔。
最轻量做法:校验
header 中的 Bearer Token,用
读取(注意 Apache 下可能要改配置才能透传)
别把密钥硬编码在代码里,用环境变量或配置文件(如
)
Token 验证失败时,必须返回
并清空 body,不能返回 200 + 错误信息
如果只是临时调试,至少加个简单签名:比如要求请求带
,服务端比对时间戳是否在 30 秒内
真正难的不是写完一个接口,而是每次改参数、加字段、换状态码时,都得同步更新文档、测试用例和前端调用方式。没人会替你记住那个
字段其实叫
,只在 v2 接口里才改过来。
$_SERVER['REQUEST_METHOD']json_encode()405 Method Not Allowed500 Internal Server ErrorContent-Typeechoheader('Content-Type: application/json; charset=utf-8');echoprintfile_get_contents('php://input')$_POSTswitch($_SERVER['REQUEST_METHOD'])$_GET$_POSTapplication/x-www-form-urlencodedmultipart/form-data/api/users?id=123$_GET['id']filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT)$raw = file_get_contents('php://input');$data = json_decode($raw, true);$data !== null$_POSTphp://input-H "Content-Type: application/json"http_response_code(200)http_response_code(404)header()header()http_response_code()echo json_encode(...)Warning: Cannot modify header informationheaders_sent($file, $line)Authorization$_SERVER['HTTP_AUTHORIZATION']getenv('API_SECRET')401 UnauthorizedX-Sign: md5(timestamp+secret)user_iduid