跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

PHP怎么写API接口_RESTful API基础写法介绍【介绍】

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

相关文章