目录
- 准备工作:了解 API 和 HTTP
- 使用 cURL 扩展(最常用、最灵活)
- GET 请求示例
- POST 请求示例
- 处理响应数据
- 完整的错误处理
- 使用 Guzzle HTTP 客户端(推荐,更现代、更强大)
- 安装 Guzzle
- GET 请求示例
- POST 请求示例
- 处理响应与错误
- 使用
file_get_contents()(简单 GET 请求)- 优点与缺点
- 示例
- API 认证:API Key / Token
在请求头中添加
(图片来源网络,侵删) - 最佳实践与注意事项
- 错误处理
- 超时设置
- 异常处理
- 日志记录
- 安全性
准备工作:了解 API 和 HTTP
在开始之前,你需要明白几个基本概念:
- API (Application Programming Interface):应用程序接口,你可以把它想象成一个餐厅的“服务员”,你的程序(顾客)通过它向另一个服务(厨房)点菜(请求数据),服务员再把做好的菜(响应数据)端给你。
- HTTP 请求方法:最常用的有:
GET:从服务器获取数据,获取用户列表、获取文章详情。POST:向服务器提交数据,通常用于创建新资源,创建一个新用户、发布一篇新文章。PUT/PATCH:更新服务器上的数据。DELETE:删除服务器上的数据。
- 请求头:附加在 HTTP 请求上的元信息,用于告诉服务器关于请求的额外信息。
Content-Type(请求体的数据类型)、Authorization(认证信息)。 - 请求体:对于
POST、PUT等请求,需要发送到服务器的数据。 - 响应:服务器返回给你的数据,通常包含:
- 状态码:如
200 OK(成功)、404 Not Found(资源不存在)、401 Unauthorized(未授权)、500 Internal Server Error(服务器错误)。 - 响应头:服务器的元信息。
- 响应体:你真正需要的数据,通常是 JSON 或 XML 格式。
- 状态码:如
重要提示:在调用任何 API 之前,请务必仔细阅读该 API 的官方文档! 文档会告诉你请求地址、需要的方法、参数、认证方式以及响应格式。
方法一:使用 cURL 扩展(最常用、最灵活)
cURL 是一个强大的库,几乎可以在所有 PHP 环境中使用,用于与服务器进行数据传输,它是 PHP 调用 API 的传统方式。
GET 请求示例
假设我们要调用一个获取用户信息的 API:https://api.example.com/users/123

<?php
// 1. 初始化 cURL 会话
$ch = curl_init();
// 2. 设置 cURL 选项
$url = 'https://api.example.com/users/123';
curl_setopt($ch, CURLOPT_URL, $url); // 设置请求的 URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将响应结果作为字符串返回,而不是直接输出
curl_setopt($ch, CURLOPT_HEADER, false); // 不包含响应头在输出中
// (可选) 设置超时时间,单位为秒
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
// 3. 执行 cURL 会话并获取响应
$response = curl_exec($ch);
// 4. 检查是否有错误发生
if (curl_errno($ch)) {
echo 'cURL 错误: ' . curl_error($ch);
} else {
// 5. 处理响应数据
// API 通常返回 JSON 格式,我们需要将其解码为 PHP 数组
$data = json_decode($response, true); // true 表示关联数组
if (json_last_error() === JSON_ERROR_NONE) {
// 成功解码,可以访问数据
echo "用户ID: " . $data['id'] . "\n";
echo "用户名: " . $data['name'] . "\n";
} else {
echo 'JSON 解码错误: ' . json_last_error_msg();
}
}
// 6. 关闭 cURL 会话
curl_close($ch);
?>
POST 请求示例
假设我们要创建一个新用户,向 https://api.example.com/users 发送 POST 请求。
<?php
// 1. 初始化 cURL
$ch = curl_init();
// 2. 设置 cURL 选项
$url = 'https://api.example.com/users';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true); // 设置为 POST 请求
// 3. 设置要发送的数据
$postData = [
'name' => 'John Doe',
'email' => 'john.doe@example.com',
'age' => 30
];
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); // 将数组转换为 URL 编码的字符串
// (可选) 设置请求头,告诉服务器我们发送的是表单数据
// 如果发送 JSON,需要设置不同的 Content-Type
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/x-www-form-urlencoded'
]);
// 4. 执行请求
$response = curl_exec($ch);
// 5. 检查错误
if (curl_errno($ch)) {
echo 'cURL 错误: ' . curl_error($ch);
} else {
$data = json_decode($response, true);
if (isset($data['id'])) {
echo "用户创建成功,新用户ID: " . $data['id'];
} else {
echo "创建失败: " . $data['message'];
}
}
// 6. 关闭 cURL
curl_close($ch);
?>
方法二:使用 Guzzle HTTP 客户端(推荐,更现代、更强大)
Guzzle 是一个流行的 PHP HTTP 客户端,它提供了更简洁、更面向对象的 API,并且内置了 Promise、异步请求、重试等高级功能,对于新项目,强烈推荐使用它。
安装 Guzzle
如果你的项目使用 Composer(PHP 的依赖管理工具),安装非常简单:
composer require guzzlehttp/guzzle
GET 请求示例
<?php
// 引入 Composer 的自动加载文件
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
// 1. 创建一个 Guzzle 客户端实例
$client = new Client([
// 'base_uri' => 'https://api.example.com', // 可以设置基础 URI
'timeout' => 2.0, // 设置超时时间
]);
try {
// 2. 发送 GET 请求
$response = $client->request('GET', '/users/123');
// 3. 获取响应状态码
echo "状态码: " . $response->getStatusCode() . "\n"; // e.g. 200
// 4. 获取响应体 (作为字符串)
$body = $response->getBody();
echo "响应体: " . $body . "\n";
// 5. 将 JSON 响应解码为 PHP 数组
$data = json_decode($body, true);
echo "用户名: " . $data['name'] . "\n";
} catch (RequestException $e) {
// 6. 处理请求异常 (如 4xx, 5xx 错误)
echo "请求失败: " . $e->getMessage() . "\n";
if ($e->hasResponse()) {
echo "响应体: " . $e->getResponse()->getBody()->getContents() . "\n";
}
}
?>
POST 请求示例
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
$client = new Client();
try {
// 准备要发送的数据
$postData = [
'name' => 'Jane Doe',
'email' => 'jane.doe@example.com',
'age' => 28
];
// 发送 POST 请求
$response = $client->request('POST', '/users', [
'json' => $postData // Guzzle 会自动设置 Content-Type 为 application/json 并编码数据
// 如果是表单数据,使用 'form_params' => $postData
]);
echo "状态码: " . $response->getStatusCode() . "\n"; // 通常是 201 (Created)
$data = json_decode($response->getBody(), true);
echo "用户创建成功,新用户ID: " . $data['id'];
} catch (RequestException $e) {
echo "请求失败: " . $e->getMessage() . "\n";
}
?>
方法三:使用 file_get_contents()(简单 GET 请求)
对于非常简单的 GET 请求,可以使用 file_get_contents(),但不推荐用于生产环境,因为它缺乏对 cURL 选项(如超时、复杂请求头)的精细控制。

<?php
$url = 'https://api.example.com/users/123';
// 创建流上下文,可以添加一些选项
$context = stream_context_create([
'http' => [
'timeout' => 10, // 设置超时
'header' => 'Content-Type: application/json' // 添加请求头
]
]);
$response = file_get_contents($url, false, $context);
if ($response === false) {
echo "请求失败";
} else {
$data = json_decode($response, true);
print_r($data);
}
?>
API 认证:API Key / Token
大多数 API 都需要认证,最常见的方式是在请求头中添加一个 API Key 或 Token。
使用 cURL
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer YOUR_API_KEY_OR_TOKEN',
'Content-Type: application/json'
]);
使用 Guzzle
$response = $client->request('GET', '/protected-resource', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY_OR_TOKEN',
'Accept' => 'application/json',
]
]);
安全提示:永远不要将你的 API Key 或 Token 直接硬编码在 PHP 文件中,特别是这些文件可能会被提交到代码仓库(如 Git),最好将它们存储在环境变量中。
最佳实践与注意事项
错误处理
- 网络错误:连接超时、服务器无响应等。
- HTTP 错误:API 返回的
4xx(客户端错误)或5xx(服务器错误)状态码。 - 数据解析错误:API 返回的 JSON 格式不正确。
Guzzle 的 try...catch 块可以很好地捕获 HTTP 错误和网络错误,cURL 则需要检查 curl_errno() 和 HTTP 状态码。
超时设置
始终为你的请求设置超时时间,以防止你的脚本因为 API 服务器响应缓慢而无限期等待。
异常处理
使用 try...catch 块是处理 API 调用中可能出现的各种问题的标准做法。
日志记录
将 API 请求和响应记录到日志文件中,对于调试和监控至关重要,你可以记录请求的 URL、参数、响应状态码和响应体。
安全性
- HTTPS:始终使用
https://来加密你的 API 通信。 - 敏感信息:不要将 API Keys、Tokens 或密码硬编码在代码中,使用
.env文件和vlucas/phpdotenv这样的库来管理环境变量。 - 输入验证:在发送数据前,验证和清理你的输入数据。
希望这份教程能帮助你顺利地在 PHP 中调用 API!
