杰瑞科技汇

PHP如何调用API接口?

目录

  1. 准备工作:了解 API 和 HTTP
  2. 使用 cURL 扩展(最常用、最灵活)
    • GET 请求示例
    • POST 请求示例
    • 处理响应数据
    • 完整的错误处理
  3. 使用 Guzzle HTTP 客户端(推荐,更现代、更强大)
    • 安装 Guzzle
    • GET 请求示例
    • POST 请求示例
    • 处理响应与错误
  4. 使用 file_get_contents()(简单 GET 请求)
    • 优点与缺点
    • 示例
  5. API 认证:API Key / Token

    在请求头中添加

    PHP如何调用API接口?-图1
    (图片来源网络,侵删)
  6. 最佳实践与注意事项
    • 错误处理
    • 超时设置
    • 异常处理
    • 日志记录
    • 安全性

准备工作:了解 API 和 HTTP

在开始之前,你需要明白几个基本概念:

  • API (Application Programming Interface):应用程序接口,你可以把它想象成一个餐厅的“服务员”,你的程序(顾客)通过它向另一个服务(厨房)点菜(请求数据),服务员再把做好的菜(响应数据)端给你。
  • HTTP 请求方法:最常用的有:
    • GET:从服务器获取数据,获取用户列表、获取文章详情。
    • POST:向服务器提交数据,通常用于创建新资源,创建一个新用户、发布一篇新文章。
    • PUT / PATCH:更新服务器上的数据。
    • DELETE:删除服务器上的数据。
  • 请求头:附加在 HTTP 请求上的元信息,用于告诉服务器关于请求的额外信息。Content-Type(请求体的数据类型)、Authorization(认证信息)。
  • 请求体:对于 POSTPUT 等请求,需要发送到服务器的数据。
  • 响应:服务器返回给你的数据,通常包含:
    • 状态码:如 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如何调用API接口?-图2
(图片来源网络,侵删)
<?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如何调用API接口?-图3
(图片来源网络,侵删)
<?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!

分享:
扫描分享到社交APP
上一篇
下一篇