curl_init() 是PHP原生调用API最稳妥方式,需正确配置CURLOPT_RETURNTRANSFER、CURLOPT_TIMEOUT等选项,POST JSON时须设Content-Type和json_encode后的字符串为body,并校验SSL证书与JSON解析结果。

用 curl_init() 发起 GET 请求最稳妥
PHP 原生调用 API,curl_init() 是兼容性最好、可控性最强的方式,尤其在 PHP 5.6+ 和 7.x/8.x 环境下稳定可靠。比 file_get_contents() 更适合带 header、超时控制或需要错误细节的场景。
常见错误是忽略 curl_setopt() 的必要配置,导致请求失败但无报错:
- 没设
CURLOPT_RETURNTRANSFER => true→ 返回bool(true)而不是响应体 - 没设
CURLOPT_TIMEOUT→ 默认永不超时,可能卡死进程 - HTTPS 接口没加
CURLOPT_SSL_VERIFYPEER => false(仅测试环境)→ cURL 报SSL certificate problem
示例(带基础错误处理):
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer abc123']);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false || $httpCode !== 200) {
throw new Exception('API request failed: ' . curl_error($ch));
}
$data = json_decode($response, true);
POST 提交 JSON 数据要设对 Content-Type 和 body
很多 API(如 RESTful 接口)要求 POST 时 body 是 JSON 字符串,且 header 明确声明 Content-Type: application/json。只用 json_encode() 拼 body 但不设 header,服务端大概率返回 400 或空响应。
关键点:
- body 必须是字符串(不是数组),用
json_encode($data)生成 - 必须显式设置
CURLOPT_POSTFIELDS为该字符串,不能传数组 - 必须设置
CURLOPT_HTTPHEADER包含Content-Type: application/json - 若 API 需要认证 token,
Authorizationheader 也要一并带上
示例:
$data = ['name' => 'Alice', 'email' => 'a@example.com'];
$body = json_encode($data);
$ch = curl_init('https://api.example.com/users');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer xyz789'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
遇到 cURL error 60 别急着关证书验证
cURL error 60: SSL certificate problem 是本地开发常见报错,本质是 cURL 不信任服务器证书链。直接设 CURLOPT_SSL_VERIFYPEER => false 能绕过,但会带来中间人攻击风险,**生产环境绝对禁止**。
更安全的做法:
- 确认服务器证书是否有效(比如用浏览器访问接口 URL,看地址栏锁图标是否正常)
- 更新系统 CA 证书包(Linux:运行
sudo apt update && sudo apt install ca-certificates;macOS:用 Homebrew 更新curl-ca-bundle) - 手动指定 CA bundle 路径:
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');(可从 https://curl.se/ca/cacert.pem 下载)
如果只是临时调试且确定网络可信,再考虑关验证——但务必加注释说明,并上线前删掉。
解析响应前先检查 json_last_error()
即使 curl_exec() 成功、HTTP 状态码是 200,API 返回的内容也不一定是合法 JSON。比如服务端出错返回 HTML 错误页、JSON 格式少逗号、中文编码异常,都会让 json_decode() 返回 null 而不报错。
必须做两层校验:
- 用
is_string($response) && !empty($response)确保有响应体 - 用
json_decode($response, true)后立即调json_last_error() === JSON_ERROR_NONE
否则后续代码访问 $data['xxx'] 可能触发 Notice 或 Fatal Error。
简单封装建议:
$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('Invalid JSON response: ' . json_last_error_msg());
}
真正难处理的是 API 文档写得模糊、字段类型不一致(比如有时返回字符串,有时返回 null)、嵌套结构深度不定——这些得靠业务逻辑兜底,不能只依赖一次 json_decode()。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











