
cURL 是一个强大的命令行工具和库,用于通过各种协议传输数据。在 PHP 中,我们可以使用 cURL 扩展来发起 HTTP 请求,例如从 RESTful API 获取数据。
首先,我们需要初始化 cURL 会话,设置请求的 URL,并指定将响应作为字符串返回而不是直接输出。
<?php
// API 请求的 URL
$url = "https://api.deezer.com/search?q=broken%20strings";
// 初始化 cURL 会话
$ch = curl_init();
// 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url); // 设置请求的 URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将响应作为字符串返回
// 执行 cURL 请求并获取响应
$resp = curl_exec($ch);
// 检查 cURL 请求是否发生错误
if (curl_error($ch)) {
echo "cURL 错误: " . curl_error($ch);
} else {
// 请求成功,继续处理响应
// ...
}
// 关闭 cURL 会话
curl_close($ch);
?>在上述代码中,CURLOPT_RETURNTRANSFER 设置为 true 是关键,它确保 curl_exec() 返回的是响应内容本身,而不是在屏幕上打印。
大多数现代 API 都以 JSON (JavaScript Object Notation) 格式返回数据。在 PHP 中,json_decode() 函数用于将 JSON 字符串转换为 PHP 变量。为了方便后续的数据访问,通常会将 JSON 解码为关联数组。
立即学习“PHP免费学习笔记(深入)”;
<?php
// ... (cURL 请求部分)
if (curl_error($ch)) {
echo "cURL 错误: " . curl_error($ch);
} else {
// 将 JSON 响应解码为 PHP 关联数组
$decoded = json_decode($resp, true);
// 检查 JSON 解码是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON 解码错误: " . json_last_error_msg();
} else {
// 解码成功,可以打印整个数组结构以供调试
// print_r($decoded);
}
}
// ... (关闭 cURL 会话)
?>json_decode($resp, true) 中的 true 参数指示函数返回关联数组,而不是对象。这使得通过字符串键访问数据变得更加直观和方便。
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
API 返回的 JSON 数据通常是嵌套的,意味着一个数组或对象中包含其他数组或对象。根据提供的示例数据结构,主要的记录列表存储在 $decoded['data'] 键下,每个记录本身又是一个包含 title 和 artist 等字段的数组,其中 artist 字段又是一个包含 name 等信息的嵌套数组。
要从所有记录中提取特定的值(例如歌曲标题和艺术家姓名),我们需要遍历 $decoded['data'] 数组,并在每次迭代中深入访问嵌套的键。
<?php
// ... (cURL 请求和 JSON 解码部分)
if (curl_error($ch)) {
echo "cURL 错误: " . curl_error($ch);
} else {
$decoded = json_decode($resp, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON 解码错误: " . json_last_error_msg();
} else {
// 确保 'data' 键存在且是一个数组
if (isset($decoded['data']) && is_array($decoded['data'])) {
// 遍历 'data' 数组中的每一个记录
foreach ($decoded['data'] as $record) {
// 提取歌曲标题
$title = isset($record['title']) ? $record['title'] : '未知标题';
// 提取艺术家姓名,需要深入到 'artist' 数组中
$artistName = isset($record['artist']['name']) ? $record['artist']['name'] : '未知艺术家';
// 输出提取到的信息
printf("歌曲标题: %s\n", $title);
printf("艺术家: %s\n\n", $artistName);
}
} else {
echo "API 响应中未找到 'data' 数组或其格式不正确。\n";
}
}
}
// ... (关闭 cURL 会话)
?>在 foreach ($decoded['data'] as $record) 循环中,每次迭代 $record 变量都会持有当前处理的歌曲记录的完整数组。然后,我们可以通过 $record['title'] 直接访问标题,并通过 $record['artist']['name'] 访问嵌套在 artist 数组中的艺术家姓名。使用 isset() 进行检查是一种良好的编程习惯,可以避免在某些键不存在时产生 PHP 警告或错误。
将上述所有步骤整合起来,形成一个完整的 PHP 脚本,用于从 Deezer API 获取搜索结果并打印歌曲标题和艺术家姓名:
<?php
// 1. 定义 API 请求的 URL
$url = "https://api.deezer.com/search?q=broken%20strings";
// 2. 初始化 cURL 会话
$ch = curl_init();
// 3. 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将响应作为字符串返回
// 4. 执行 cURL 请求
$resp = curl_exec($ch);
// 5. 检查 cURL 请求是否发生错误
if (curl_error($ch)) {
echo "cURL 错误: " . curl_error($ch) . "\n";
} else {
// 6. 将 JSON 响应解码为 PHP 关联数组
$decoded = json_decode($resp, true);
// 7. 检查 JSON 解码是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON 解码错误: " . json_last_error_msg() . "\n";
} else {
// 8. 检查并遍历 'data' 数组
if (isset($decoded['data']) && is_array($decoded['data'])) {
echo "--- 搜索结果 ---\n\n";
foreach ($decoded['data'] as $index => $record) {
// 9. 提取歌曲标题和艺术家姓名
$title = isset($record['title']) ? $record['title'] : '未知标题';
$artistName = isset($record['artist']['name']) ? $record['artist']['name'] : '未知艺术家';
// 10. 输出提取到的信息
printf("记录 %d:\n", $index + 1);
printf(" 歌曲标题: %s\n", $title);
printf(" 艺术家: %s\n\n", $artistName);
}
echo "-----------------\n";
} else {
echo "API 响应中未找到 'data' 数组或其格式不正确。\n";
}
}
}
// 11. 关闭 cURL 会话
curl_close($ch);
?>通过遵循这些步骤和最佳实践,您可以有效地使用 PHP cURL 从各种 API 获取和解析多层级 JSON 数据,并准确提取所需的信息。
以上就是使用 PHP cURL 从 API 获取并解析多层级 JSON 数据的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号