PHP调用API核心是发请求和解析响应,关键在于正确处理认证、编码、超时及状态码;需用curl_exec()精细控制Header,显式设置CURLOPT_RETURNTRANSFER,检查curl_error()和HTTP状态码,验证JSON格式后再解码。

PHP 调用网站 API 接口获取数据,核心就两步:发请求、解析响应。能不能拿到数据,不取决于你用了 cURL 还是 file_get_contents,而在于是否正确处理了认证、编码、超时和状态码。
用 curl_exec() 发送带 Header 的 GET 请求
多数公开 API(如 GitHub、天气接口)要求在请求头中带上 Authorization 或 Accept,直接用 file_get_contents() 很难控制这些细节,curl_exec() 更稳妥。
- 必须显式设置
CURLOPT_RETURNTRANSFER为true,否则返回bool(true)而不是响应体 - 务必检查
curl_error($ch),网络中断、DNS 失败时curl_exec()可能返回空字符串但不报错 - API 返回 JSON 时,记得加
Accept: application/json,否则某些服务(如 Stripe)会返回 HTML 错误页 - 示例关键片段:
$ch = curl_init('https://api.example.com/data'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer abc123', 'Accept: application/json']); $response = curl_exec($ch); if (curl_errno($ch)) { throw new Exception('cURL error: ' . curl_error($ch)); } curl_close($ch);
用 json_decode() 解析响应前先验证格式
很多新手直接 json_decode($response),结果得到 null 却找不到原因——其实是因为响应不是合法 JSON,可能是 HTTP 错误页、重定向 HTML,或 API 返回了空字符串。
- 先用
trim($response) === ''排除空响应 - 再用
json_last_error() === JSON_ERROR_NONE确认解码成功,否则查json_last_error_msg() - 注意:如果 API 返回的是数组形式 JSON(如
[{"id":1}]),json_decode()默认返回stdClass对象,要加第二个参数true才得关联数组 - 别忽略 HTTP 状态码:即使
curl_exec()成功,curl_getinfo($ch, CURLINFO_HTTP_CODE)可能是401或429,此时$response通常是错误描述而非数据
处理 Token 过期、限流等常见 API 错误响应
真实场景里,API 不会永远返回 200 + 正常 JSON。你要主动识别错误类型,而不是让程序卡死或静默失败。
立即学习“PHP免费学习笔记(深入)”;
- HTTP 401/403:大概率是
Authorization头缺失、Token 过期或权限不足,检查WWW-Authenticate响应头提示 - HTTP 429:说明触发限流,响应头中常含
Retry-After,需暂停后再试,不能暴力重试 - HTTP 500/503:服务端问题,建议加指数退避(如首次等 1s,失败则等 2s、4s…)
- JSON 中含
"error"字段(如{"error":"invalid_grant"}):这是业务层错误,需按字段值做分支处理,不是网络问题
真正难的不是调通一次 API,而是让代码在 Token 刷新、字段变更、服务降级时还能稳住——这些细节藏在响应头、错误结构和重试逻辑里,而不是某一行 curl_exec() 里。











